Je vais commander ce guide en fonction du niveau de compétence que vous avez à Haskell, allant d'un débutant absolu à un expert. Notez que ce processus prendra plusieurs mois (années?), Il est donc assez long.
Débutant
Premièrement, Haskell est capable de tout, avec suffisamment d'habileté. Il est très rapide (derrière seulement C et C ++ selon mon expérience), et peut être utilisé pour n'importe quoi, des simulations aux serveurs, aux guis et aux applications Web.
Cependant, certains problèmes sont plus faciles à écrire pour un débutant en Haskell que pour d'autres. Les problèmes mathématiques et les programmes de processus de liste sont de bons candidats pour cela, car ils ne nécessitent que les connaissances les plus élémentaires de Haskell pour pouvoir écrire.
Tout d'abord, quelques bons guides pour apprendre les bases de Haskell sont le tutoriel happy learn 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 également des problèmes simples avec ce que vous savez.
Deux autres bonnes ressources sont la programmation Haskell des premiers principes et la programmation Haskell . Ils sont tous deux accompagnés d'exercices pour chaque chapitre, vous avez donc de petits problèmes simples correspondant à ce que vous avez appris dans les dernières pages.
Une bonne liste de problèmes à essayer est la page des problèmes de haskell 99 . Celles-ci commencent très basiques et deviennent plus difficiles au fur et à mesure. C'est une très bonne pratique d'en faire beaucoup, car ils vous permettent de mettre en pratique vos compétences dans les fonctions de récursivité et d'ordre supérieur. Je recommanderais d'ignorer tous les problèmes qui nécessitent un caractère aléatoire car c'est un peu plus difficile à Haskell. Cochez cette question SO au cas où vous voudriez tester vos solutions avec QuickCheck (voir Intermédiaire ci-dessous).
Une fois que vous en avez fait quelques-uns, vous pouvez passer à quelques-uns des problèmes de Project Euler . Celles-ci sont triées en fonction du nombre de personnes qui les ont terminées, ce qui est un assez bon indicateur de difficulté. Ceux-ci testent votre logique et Haskell plus que les problèmes précédents, mais vous devriez toujours pouvoir faire les premiers. Un gros avantage de Haskell avec ces problèmes est que les nombres entiers ne sont pas limités en taille. Pour résoudre certains de ces problèmes, il sera utile d'avoir lu également les chapitres 7 et 8 de vous apprendre un Haskell.
Débutant
Après cela, vous devriez avoir une assez bonne maîtrise des fonctions de récursivité et d'ordre supérieur, donc ce serait le bon moment pour commencer à résoudre des problèmes plus réels. Un très bon point de départ est Real World Haskell (livre en ligne, vous pouvez également acheter une copie papier). J'ai trouvé les premiers chapitres introduits trop rapidement pour quelqu'un qui n'avait jamais fait de programmation fonctionnelle / utilisé de récursivité auparavant. Cependant, avec la pratique que vous auriez eue en faisant les problèmes précédents, vous devriez le trouver parfaitement compréhensible.
Résoudre les problèmes du livre est un excellent moyen d'apprendre à gérer les abstractions et à créer des composants réutilisables dans Haskell. Ceci est vital pour les personnes habituées à la programmation orientée objet (oo), car les méthodes d'abstraction oo normales (classes oo) n'apparaissent pas dans Haskell (Haskell a des classes de type, mais elles sont très différentes des classes oo, plus comme des interfaces oo ). 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 certain temps, vous arriverez au chapitre 14, le chapitre redouté des monades (dum dum dummmm). Presque tous ceux qui apprennent Haskell ont du mal à comprendre les monades, en raison de l'abstrait du concept. Je ne peux penser à aucun concept dans un autre langage aussi abstrait que les monades dans la programmation fonctionnelle. Monads permet à de nombreuses idées (telles que les opérations d'E / S, les calculs qui pourraient échouer, l'analyse, ...) d'être unifiées sous une seule idée. Ne vous découragez donc pas si, après avoir lu le chapitre sur les monades, vous ne les comprenez pas vraiment. J'ai trouvé utile de lire de nombreuses explications différentes sur les monades; chacun donne une nouvelle perspective sur le problème. Voici une très bonne liste de tutoriels monade . Je recommande vivement le All About Monads , mais les autres sont également bons.
De plus, il faut un certain temps pour que les concepts s'enracinent vraiment. Cela passe par l'utilisation, mais aussi par le temps. Je trouve que parfois dormir sur un problème aide plus que tout! Finalement, l'idée cliquera et vous vous demanderez pourquoi vous avez eu du mal à comprendre un concept qui est en réalité 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 préféré :)
Pour vous assurer que vous comprenez parfaitement le système de type Haskell, vous devez essayer de résoudre 20 exercices de haskell intermédiaires . Ces exercices utilisent des noms amusants de fonctions comme "velu" et "banane" et vous aident à avoir une bonne compréhension de certains concepts de programmation fonctionnelle de base si vous ne les avez pas déjà. Belle façon de passer votre soirée avec un tas de papiers recouverts de flèches, de licornes, de saucisses et de bananes à fourrure.
Intermédiaire
Une fois que vous comprenez Monads, je pense que vous avez fait la transition d'un programmeur débutant Haskell à un haskeller intermédiaire. Alors où aller d'ici? La première chose que je recommanderais (si vous ne les avez pas déjà apprises en apprenant les monades) est les différents types de monades, tels que Reader, Writer et State. Encore une fois, le monde réel Haskell et All about monads donne une grande couverture de cela. Pour compléter votre formation sur les monades, il est indispensable de se familiariser avec les transformateurs monades. Ceux-ci vous permettent de combiner différents types de monades (comme un lecteur et une monade d'état) en une seule. Cela peut sembler inutile au début, mais après les avoir utilisés pendant un certain temps, vous vous demanderez comment vous avez vécu sans eux.
Vous pouvez maintenant terminer le livre Haskell du monde réel si vous le souhaitez. Sauter des chapitres maintenant n'a plus vraiment d'importance, tant que vous avez des monades en panne. Choisissez simplement ce qui vous intéresse.
Avec les connaissances que vous possédez maintenant, vous devriez pouvoir utiliser la plupart des paquets sur cabal (enfin ceux 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 analyser des programmes et du texte. Beaucoup mieux que d'utiliser des expressions rationnelles. Excellente documentation, a également un chapitre Haskell du monde réel.
QuickCheck : Un programme de test très cool. Ce que vous faites, c'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 générera un grand nombre de valeurs aléatoires (dans ce cas des listes) et testera que le prédicat est vrai pour tous les résultats. Voir aussi le manuel en ligne .
HUnit : tests unitaires à Haskell.
gtk2hs : Le framework gui le plus populaire pour Haskell, vous permet d'écrire des applications gtk dans Haskell.
happstack : Un framework de développement web pour Haskell. N'utilise pas de bases de données, mais un magasin de types de données. Assez bons documents (d'autres frameworks populaires seraient snap et yesod ).
En outre, il existe de nombreux concepts (comme le concept Monade) 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 Typeclassopedia est un très bon aperçu pour en savoir plus sur ces concepts de haut niveau et sur la manière dont ils s’emboîtent .
Applicatif: Une interface comme Monads, mais moins puissante. Chaque Monade est Applicative, mais pas l'inverse. Ceci est utile car il existe certains types qui sont applicatifs mais pas des monades. En outre, le code écrit à l'aide des fonctions applicatives est souvent plus composable que l'écriture du code équivalent à l'aide des fonctions Monad. Voir Functors, Applicative Functors et Monoids du guide Learn you a haskell.
Pliable , Traversable : Classes qui résument de nombreuses opérations de listes, de sorte que les mêmes fonctions peuvent être appliquées à d'autres types de conteneurs. Voir aussi l' explication du wiki haskell .
Monoïde : un monoïde est un type qui a une valeur nulle (ou vide) et une opération, notée, <>
qui relie deux monoïdes ensemble, tels que x <> mempty = mempty <> x = x
et x <> (y <> z) = (x <> y) <> z
. Ces lois sont appelées lois sur l'identité et l'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 élémentaire, 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 les anciennes fonctions Haskell.
Tableaux : les différents tableaux mutables / immuables dans Haskell.
ST Monad : permet d'écrire du code avec un état mutable qui s'exécute très rapidement, tout en restant pur en dehors 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 une interface graphique). Je ne connais cependant pas grand-chose à ce sujet. Le discours de Paul Hudak sur le yampa est un bon début.
Il y a beaucoup de nouvelles fonctionnalités linguistiques que vous devriez regarder. Je vais simplement les énumérer, vous pouvez trouver de nombreuses informations à leur sujet sur Google, le wikibook haskell , le site haskellwiki.org et la documentation ghc .
- Classes de types multiparamètres / dépendances fonctionnelles
- Familles de types
- Types existentiellement quantifiés
- Types fantômes
- GADTS
- autres...
Une grande partie de Haskell est basée sur la théorie des catégories , donc vous voudrez peut-être examiner cela. Un bon point de départ est la théorie des catégories pour l'informaticien . Si vous ne voulez pas acheter le livre, l' article connexe de l'auteur est également excellent.
Enfin, vous voudrez en savoir plus sur les différents outils Haskell. Ceux-ci inclus:
- ghc (et toutes ses fonctionnalités)
- cabale : le système de package Haskell
- darcs : un système de contrôle de version distribué écrit en Haskell, très populaire pour les programmes Haskell.
- haddock : 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 dans Haskell. Cela peut être n'importe quoi (par exemple un petit jeu, un analyseur de données, un site Web, un compilateur ). Travailler sur cela vous permettra d'appliquer bon nombre des choses que vous apprenez maintenant. Vous restez à ce niveau pendant des âges (c'est là que je suis).
Expert
Il vous faudra des années pour arriver à ce stade (bonjour de 2009!), Mais à partir d'ici, je suppose que vous commencez à écrire des articles de doctorat, de nouvelles extensions ghc et à trouver de nouvelles abstractions.
Obtenir de l'aide
Enfin, alors qu'à n'importe quel stade de l'apprentissage, il existe plusieurs endroits pour obtenir des informations. Ceux-ci sont:
- le canal #haskell irc
- les 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.
- d'autres endroits répertoriés sur la page d'accueil de haskell.org
Conclusion
Eh bien, cela s'est avéré plus long que prévu ... Quoi qu'il en soit, je pense que c'est une très bonne idée de maîtriser 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 Ruby après avoir appris Java, mais comme apprendre Java après avoir appris C. De plus, je constate que mes compétences en programmation orientée objet se sont améliorées grâce à l'apprentissage de Haskell, car je vois de nombreuses nouvelles façons d'abstraire des idées.