Question Premiers pas avec Haskell


Pendant quelques jours, j'ai essayé de comprendre le paradigme de la programmation fonctionnelle chez Haskell. J'ai fait cela en lisant des tutoriels et en regardant des screencasts, mais rien ne semble vraiment coller. Maintenant, en apprenant divers langages impératifs / OO (comme C, Java, PHP), les exercices ont été un bon moyen pour moi d'aller. Mais comme je ne sais pas vraiment de quoi Haskell est capable et parce qu'il y a beaucoup de nouveaux concepts à utiliser, je n'ai pas su par où commencer.

Alors, comment as-tu appris Haskell? Qu'est-ce qui vous a vraiment «brisé la glace»? Aussi, de bonnes idées pour commencer des exercices?


758


origine


Réponses:


Je vais commander ce guide par le niveau de compétence que vous avez en haskell, allant d'un débutant absolu à un expert. Notez que ce processus prendra plusieurs mois (années?), Il est donc plutôt long.

Débutant

Premièrement, haskell est capable de tout, avec assez de compétences. Il est très rapide (derrière seulement c et c ++ dans mon expérience), et peut être utilisé pour tout, des simulations aux serveurs, guis et applications web.

Cependant, il y a quelques problèmes qui sont plus faciles à écrire pour un débutant en haskell que d'autres. Les problèmes mathématiques et les programmes de processus de listes sont de bons candidats, car ils n'ont besoin que des connaissances de bases les plus élémentaires pour pouvoir écrire.

Tout d'abord, quelques bons guides pour apprendre les bases de Haskell sont les heureux apprendre tutoriel haskell et les 6 premiers chapitres de vous apprendre un haskell. En les lisant, c'est une très bonne idée de résoudre aussi des problèmes simples avec ce que vous savez.

Deux autres bonnes ressources sont Haskell Programmation à partir des premiers principes, et Programmation à Haskell. Ils viennent tous deux avec des exercices pour chaque chapitre, donc vous avez de petits problèmes simples correspondant à ce que vous avez appris sur les dernières pages.

Une bonne liste de problèmes à essayer est la haskell 99 problèmes page. Ceux-ci commencent très basiques, et deviennent plus difficiles que vous continuez. C'est une très bonne pratique de faire beaucoup de ceux-ci, car ils vous permettent de pratiquer vos compétences dans la récursivité et les fonctions d'ordre supérieur. Je recommande de sauter tous les problèmes qui nécessitent un caractère aléatoire, car c'est un peu plus difficile en haskell. Vérifier cette question SO dans le cas où vous voulez tester vos solutions avec QuickCheck (voir Intermédiaire au dessous de).

Une fois que vous avez fait quelques-uns de ceux-ci, vous pouvez passer à quelques-uns des Projet Euler problèmes. Ceux-ci sont triés selon le nombre de personnes qui les ont terminés, ce qui est un assez bon indicateur de difficulté. Ceux-ci testent votre logique et votre haskell plus que les problèmes précédents, mais vous devriez toujours être capable de faire les premiers. Un gros avantage de haskell avec ces problèmes est que les entiers ne sont pas limités en taille. Pour compléter certains de ces problèmes, il sera utile d'avoir lu les chapitres 7 et 8 de vous apprendre aussi un haskell.

Débutant

Après cela, vous devriez avoir une assez bonne idée de la récursivité et des fonctions d'ordre supérieur, donc ce serait un bon moment pour commencer à faire quelques problèmes plus réels. Un très bon endroit pour commencer est Le monde réel Haskell (livre en ligne, vous pouvez également acheter une copie papier). J'ai trouvé les premiers chapitres trop introduits trop rapidement pour quelqu'un qui n'a jamais fait de programmation fonctionnelle / recursion utilisée auparavant. Cependant, avec la pratique que vous auriez eu de faire les problèmes précédents, vous devriez le trouver parfaitement compréhensible.

Travailler à travers les problèmes dans le livre est un excellent moyen d'apprendre à gérer les abstractions et à construire des composants réutilisables en haskell. Ceci est essentiel pour les personnes habituées à la programmation orientée objet (oo), car les méthodes normales d'abstraction (oo classes) n'apparaissent pas dans haskell (haskell a des classes de types, mais elles sont très différentes de oo classes, plus comme oo interfaces ). Je ne pense pas que ce soit une bonne idée de sauter des chapitres, car chacun introduit beaucoup de nouvelles idées qui sont utilisées dans les chapitres suivants.

Après un moment, vous arriverez au chapitre 14, le chapitre des monades tant redouté (dum dum dummmm). Presque tout le monde qui apprend haskell a de la difficulté à comprendre les monades, en raison de son degré d'abstraction. Je ne peux pas penser à un concept dans un autre langage aussi abstrait que celui des monades dans la programmation fonctionnelle. Les monades permettent d'unifier plusieurs idées (telles que les opérations d'E / S, les calculs qui pourraient échouer, l'analyse syntaxique, ...) sous une même idée. Alors ne vous découragez pas si après avoir lu le chapitre des monades vous ne les comprenez pas vraiment. J'ai trouvé utile de lire plusieurs explications différentes des monades; chacun donne une nouvelle perspective sur le problème. Voici un très bon liste des tutoriels monad. Je recommande fortement le Tout sur les monadesmais les autres sont aussi bons.

De plus, il faut du temps pour que les concepts s'enracinent vraiment. Cela vient de l'utilisation, mais aussi du temps. Je trouve que parfois dormir sur un problème aide plus que toute autre chose! Finalement, l'idée va cliquer, et vous vous demanderez pourquoi vous avez lutté pour comprendre un concept qui, en réalité, est incroyablement simple. C'est génial quand cela arrive, et quand c'est le cas, vous pourriez trouver haskell comme votre langage de programmation impératif favori :)

Pour vous assurer que vous comprenez parfaitement le système de type Haskell, vous devriez essayer de résoudre 20 exercices de haskell intermédiaires. Ces exercices utilisent des noms amusants de fonctions comme «furry» et «banana» et vous aident à bien comprendre certains concepts de base de la programmation fonctionnelle si vous ne les avez pas déjà. Belle façon de passer votre soirée avec une liste de papier couvert de flèches, de licornes, de saucisses et de bananes poilues.

Intermédiaire

Une fois que vous comprenez Monades, je pense que vous avez fait la transition d'un programmeur de haskell débutant à un haskeller intermédiaire. Alors, où aller à partir d'ici? La première chose que je recommanderais (si vous ne les avez pas déjà apprises en apprenant des monades) est les différents types de monades, tels que Reader, Writer et State. Encore une fois, le monde réel haskell et Tout sur les monades donne une bonne couverture de cela. Pour compléter votre entraînement de monade apprendre sur les transformateurs monad est un must. Ceux-ci vous permettent de combiner différents types de monades (comme un lecteur et une monade d'État) en un seul. Cela peut sembler inutile au départ, mais après les avoir utilisés pendant un certain temps, vous vous demanderez comment vous avez vécu sans eux.

Maintenant vous pouvez finir le livre du monde réel de haskell si vous voulez. Sauter des chapitres maintenant n'a pas vraiment d'importance, tant que vous avez des monades en bas de pat. Choisissez simplement ce qui vous intéresse.

Avec les connaissances que vous auriez maintenant, vous devriez être en mesure d'utiliser la plupart des paquets sur cabal (bien ceux qui sont documentés au moins ...), ainsi que la plupart des bibliothèques fournies avec haskell. Une liste de bibliothèques intéressantes à essayer serait:

  • Parsec: pour l'analyse des programmes et du texte. Beaucoup mieux que d'utiliser des expressions rationnelles. Excellente documentation, a également un chapitre de haskell du monde réel.

  • Vérification rapide: Un programme de test très cool. Ce que vous faites est écrire un prédicat qui devrait toujours être vrai (par exemple length (reverse lst) == length lst). Vous passez ensuite le prédicat le quickCheck, et il va générer beaucoup de valeurs aléatoires (dans ce cas des listes) et tester que le prédicat est vrai pour tous les résultats. Voir aussi manuel en ligne.

  • HUnit: Tests unitaires en haskell.

  • gtk2hs: Le framework gui le plus populaire pour haskell, vous permet d'écrire des applications gtk en haskell.

  • happstack: Un framework de développement web pour haskell. N'utilise pas de bases de données, mais un magasin de type de données. Assez bons docs (d'autres cadres populaires seraient casser et yesod).

En outre, il existe de nombreux concepts (comme le concept Monad) que vous devriez éventuellement apprendre. Ce sera plus facile que d'apprendre les Monades la première fois, car votre cerveau sera habitué à gérer le niveau d'abstraction impliqué. Un très bon aperçu de l'apprentissage de ces concepts de haut niveau et de leur compatibilité Typeclassopedia.

  • Applicatif: Une interface comme les Monades, mais moins puissante. Chaque Monade est Applicative, mais pas vice versa. Ceci est utile car il y a certains types qui sont Applicative mais ne sont pas des Monades. En outre, le code écrit en utilisant les fonctions applicatives est souvent plus composable que l'écriture du code équivalent en utilisant les fonctions Monad. Voir Functors, Functors Applicatifs et Monoides de l'apprendre un guide de haskell.

  • Pliable,Traversable: Typeclasses qui abstrait de nombreuses opérations de listes, de sorte que les mêmes fonctions peuvent être appliquées à d'autres types de conteneurs. Voir aussi explication de wiki haskell.

  • Monoïde: Un Monoid est un type qui a une valeur nulle (ou mempty), et une opération, notée <> qui relie deux monoïdes ensemble, de telle sorte que x <> mempty = mempty <> x = x et x <> (y <> z) = (x <> y) <> z. Ce sont les lois d'identité et d'associativité. De nombreux types sont des monoïdes, tels que les nombres, avec mempty = 0 et <> = +. Ceci est utile dans de nombreuses situations.

  • Flèches: Les flèches sont un moyen de représenter les calculs qui prennent une entrée et retournent une sortie. Une fonction est le type de flèche le plus basique, mais il existe de nombreux autres types. La bibliothèque possède également de nombreuses fonctions très utiles pour manipuler les flèches - elles sont très utiles même si elles ne sont utilisées qu'avec de simples fonctions de haskell.

  • Tableaux: les différents tableaux mutables / immuables en haskell.

  • ST Monad: vous permet d'écrire du code avec un état mutable qui s'exécute très rapidement, tout en restant pur à l'extérieur de la monade. Voir le lien pour plus de détails.

  • FRP: Functional Reactive Programming, une nouvelle façon expérimentale d'écrire du code qui gère les événements, les déclencheurs, les entrées et les sorties (comme un gui). Je ne sais pas beaucoup à ce sujet. Paul Hudak parle de yampa est un bon début.

Il y a beaucoup de nouvelles fonctionnalités linguistiques que vous devriez regarder. Je vais juste les énumérer, vous pouvez trouver beaucoup d'informations à leur sujet à partir de google, le haskell wikibook, le site haskellwiki.org et documentation ghc.

  • Classes de types multiparamètres / dépendances fonctionnelles
  • Tapez les familles
  • Types quantifiés existentiellement
  • Types de fantômes
  • GADTS
  • autres...

Beaucoup de haskell est basé autour de théorie des catégories, alors vous voudrez peut-être examiner cela. Un bon point de départ est Catégorie Théorie pour informaticien. Si vous ne voulez pas acheter le livre, les liens de l'auteur article est également excellent.

Enfin, vous voudrez en savoir plus sur les différents outils de haskell. Ceux-ci inclus:

  • ghc (et toutes ses fonctionnalités)
  • cabale: le système de paquets haskell
  • darcs: un système de contrôle de version distribué écrit en haskell, très populaire pour les programmes haskell.
  • églefin: un générateur de documentation automatique haskell

Tout en apprenant toutes ces nouvelles bibliothèques et concepts, il est très utile d'écrire un projet de taille moyenne en haskell. Cela peut être n'importe quoi (ex: un petit jeu, un analyseur de données, un site web, compilateur). Travailler sur cela vous permettra d'appliquer plusieurs des choses que vous êtes en train d'apprendre. Vous restez à ce niveau pendant des siècles (c'est où je suis).

Expert

Il faudra des années pour arriver à ce stade (bonjour à partir de 2009!), Mais d'ici je suppose que vous commencez à écrire des articles de phd, de nouvelles extensions de ghc, et à venir avec de nouvelles abstractions.

Obtenir de l'aide

Enfin, à n'importe quelle étape de l'apprentissage, il existe plusieurs endroits où obtenir de l'information. Ceux-ci sont:

  • le canal #haskell irc
  • la listes de diffusion. Ceux-ci valent la peine de s'inscrire juste pour lire les discussions qui ont lieu - certains sont très intéressants.
  • autres lieux listés sur la page d'accueil de haskell.org

Conclusion

Eh bien, cela s'est avéré plus long que ce à quoi je m'attendais ... Quoi qu'il en soit, je pense que c'est une très bonne idée de devenir compétent en haskell. Cela prend beaucoup de temps, mais c'est principalement parce que vous apprenez une toute nouvelle façon de penser en le faisant. Ce n'est pas comme apprendre le rubis après avoir appris java, mais comme apprendre java après avoir appris c. En outre, je trouve que mes compétences en programmation orientée objet ont été améliorées grâce à l'apprentissage du haskell, car je vois beaucoup de nouvelles façons d'abstraire des idées.


2318



Un de mes collègues avait une bonne expérience avec Apprenez-vous un Haskell pour le grand bien!.

Tutoriel destiné aux personnes qui ont   expérience en programmation impérative   langues, mais n'ont pas programmé dans un   langage fonctionnel avant.

Et vérifiez les réponses ici aussi


170



Voici un bon livre que vous pouvez lire en ligne: Le monde réel Haskell

La plupart des programmes Haskell que j'ai fait ont été pour résoudre Projet Euler problèmes.

Un conseil que j'ai lu il n'y a pas si longtemps était que vous devriez avoir un ensemble standard de problèmes simples que vous savez résoudre (en théorie) et chaque fois que vous essayez d'apprendre une nouvelle langue, vous implémentez ces problèmes dans cette langue.


98



J'ai aimé regarder cette série de 13 épisodes sur la programmation fonctionnelle en utilisant Haskell.

Conférences C9: Dr. Erik Meijer - Principes de la programmation fonctionnelle: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/


70



Pour ajouter aux réponses des autres - il y en a une qui vous aidera lors du codage (par exemple lors de la résolution des problèmes du projet Euler): Hoogle. Vous pouvez utiliser soit l'interface de ligne de commande, soit interface Web.

Ligne de commande

Après avoir installé la plate-forme Haskell assurez-vous de cabal install hoogle

Exemple d'utilisation de Hoogle:

Vous avez une fonction f x = 3 * x + 1 et vous voulez l'appliquer sur (5 :: Int), puis l'appliquer sur le résultat et sur ce résultat et ainsi de suite et obtenir une liste infinie de ces valeurs. Vous pensez qu'il pourrait déjà exister une fonction pour vous aider (pas spécifiquement pour votre f bien que).

Cette fonction serait de type (a -> a) -> a -> [a] si cela prend f 5 ou a -> (a -> a) -> [a] si cela prend 5 f (Nous supposons que la fonction est pour les types généraux et pas seulement Ints)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

oui, la fonction dont vous avez besoin existe déjà et il s'appelle iterate. vous l'utilisez par iterate func 5!

interface Web

Le résultat pour le même exemple peut être trouvé ici.


64



Graham Hutton's Programmation à Haskell est concis, raisonnablement complet, et ses années d'enseignement montrent vraiment Haskell. C'est presque toujours ce que je recommande aux gens, peu importe où vous allez.

En particulier, le chapitre 8 («Analyseurs fonctionnels») fournit le véritable travail de base dont vous avez besoin pour commencer à traiter avec les monades, et je pense que c'est de loin le meilleur endroit pour commencer, suivi par Tout sur les monades. (En ce qui concerne ce chapitre, cependant, notez les errata du site Web, cependant: vous ne pouvez pas utiliser le do forme sans une aide particulière. Vous voudrez peut-être en apprendre d'abord sur les typeclasses et résoudre vous-même ce problème.)

Ceci est rarement souligné aux débutants de Haskell, mais cela vaut la peine d'apprendre assez tôt, pas seulement sur l'utilisation des monades, mais sur la construction des vôtres. Ce n'est pas difficile et les tâches personnalisées peuvent rendre un certain nombre de tâches plus simples.


53



N'essayez pas de lire tous les didacticiels de la monade avec des métaphores amusantes. Ils vont juste vous faire confondre encore pire.


49



Je suggère de rejoindre le #haskell irc channelet poser des questions là-bas. C'est comme ça que j'ai appris Haskell. Si vous passez par le monde réel Haskell comme suggéré ci-dessus, des réponses en temps réel à vos questions aideront grandement. Beaucoup de gens intelligents sur #haskell écrivent Haskell pour le plaisir et pour le profit, donc vous aurez beaucoup de bons commentaires. Essayez-le!


30



Ce sont mes préférés

Haskell: Programmation fonctionnelle avec types

Joeri van Eekelen, et al. | Wikibooks
       Published in 2012, 597 pages

Le monde réel Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages

22



Je peux aussi recommander Encore un autre tutoriel Haskell en introduction.

Une autre bonne ressource d'apprentissage (probablement sur le niveau intermédiaire), qui m'a beaucoup aidé et qui n'a pas été mentionnée dans les autres réponses pour autant que je puisse voir, est celle de Brent Yorgey. Typeclassopedia, qui peut être trouvé dans Le lecteur de la monade (Numéro 13) 

Il est écrit dans un style très accessible et contient (parmi beaucoup d'autres choses), les conseils d'introduction suivants:

Il y a deux clefs à la sagesse d'un hacker d'expert Haskell:

  1. Comprendre les types.

  2. Avoir une intuition profonde pour chaque classe de type et sa relation avec les autres   classes de type, soutenu par la familiarité avec de nombreux exemples.

Le lecteur de la monade lui-même est un trésor absolu pour les programmeurs fonctionnels (pas seulement les programmeurs Haskell).


18