Pendant quelques jours, j'ai essayé de comprendre le paradigme de la programmation fonctionnelle en 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’y aller. Mais comme je ne sais pas vraiment de quoi Haskell est capable et qu'il y a beaucoup de nouveaux concepts à utiliser, je ne sais pas par où commencer.
Alors, comment as-tu appris Haskell? Qu'est-ce qui t'a fait vraiment "casser la glace"? Aussi, de bonnes idées pour commencer les exercices?
Je vais commander ce guide en fonction du niveau de compétence que vous avez à Haskell, allant du débutant absolu à l'expert. Notez que ce processus prendra plusieurs mois (années?), Il est donc plutôt long.
Débutant absolu
Tout d’abord, Haskell est capable de tout, avec suffisamment d’habileté. Il est très rapide (derrière C et C++, selon mon expérience), et peut être utilisé pour tout, des simulations aux serveurs, en passant par les applications Web.
Cependant, certains problèmes sont plus faciles à écrire pour un débutant en Haskell que d'autres. Les problèmes mathématiques et les programmes de processus de liste sont de bons candidats, car ils n'ont besoin que des connaissances de base de Haskell pour pouvoir écrire.
Tout d’abord, quelques bons guides pour apprendre les bases de Haskell sont les tutoriel d’apprentissage heureux d’ haskell et les 6 premiers chapitres de apprenez 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 Programmation Haskell à partir des premiers principes , et Programmation en Haskell . Ils comportent tous deux des exercices pour chaque chapitre. Vous avez donc de petits problèmes simples qui correspondent à ce que vous avez appris au cours des dernières pages.
Une bonne liste de problèmes à essayer est la page haskell 99 problem . Celles-ci commencent très basiques et deviennent plus difficiles à mesure que vous avancez. C’est une très bonne pratique de faire beaucoup d’entre elles, car elles vous permettent de pratiquer vos compétences dans des fonctions de récursivité et d’ordre supérieur. Je recommanderais d'éviter les problèmes qui requièrent un caractère aléatoire, car c'est un peu plus difficile en Haskell. Cochez this SO question au cas où vous souhaiteriez tester vos solutions avec QuickCheck (voir Intermédiaire ci-dessous).
Une fois que vous avez fait quelques-unes de ces tâches, vous pouvez passer à quelques-uns des problèmes liés à Project Euler . Celles-ci sont classées en fonction du nombre de personnes qui les ont complétées, ce qui est un assez bon indice de difficulté. Celles-ci testent davantage votre logique et Haskell que les problèmes précédents, mais vous devriez quand même être capable de faire les premiers. Un grand avantage de Haskell avec ces problèmes est que les entiers ne sont pas limités en taille. Pour résoudre certains de ces problèmes, il sera utile d’avoir également lu les chapitres 7 et 8 du manuel Haskell.
Débutant
Après cela, vous devriez avoir une assez bonne maîtrise de la récursivité et des fonctions d'ordre supérieur. Ce serait donc un bon moment pour commencer à faire face à 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 trop introduits trop rapidement pour quelqu'un qui n'a jamais fait de programmation fonctionnelle/utilisé la récursivité auparavant. Cependant, avec la pratique que vous auriez pu avoir en résolvant les problèmes précédents, vous devriez le trouver parfaitement compréhensible.
Travailler à travers les problèmes du livre est un excellent moyen d'apprendre à gérer les abstractions et à construire des composants réutilisables en 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 types, mais elles sont très différentes des classes oo, plutôt que 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 moment, vous arriverez au chapitre 14, le chapitre redouté des monades (dum dum dummmm). Presque tous ceux qui apprennent que Haskell a du mal à comprendre les monades, à cause de l'abstraction du concept. Je ne vois aucun concept dans un autre langage aussi abstrait que les monades dans la programmation fonctionnelle. Monads permet à de nombreuses idées (telles que IO opérations, calculs qui pourraient échouer, analyse, ...) d'être unifiées sous une même idée. Donc, ne vous découragez 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 un très bon liste de tutoriels de monade . Je recommande fortement le All About Monads , mais les autres sont également bons.
En outre, il faut un certain temps pour que les concepts s’intègrent 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 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 se produit, et quand cela se produit, vous pourriez penser que Haskell est votre langage de programmation impératif préféré :)
Pour vous assurer que vous comprenez parfaitement le système de types Haskell, vous devez essayer de résoudre 20 exercices de haskell intermédiaires . Ces exercices utilisent des noms amusants de fonctions telles que "poilu" et "banane" 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 la 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 avez compris Monads, je pense que vous êtes passé 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à appris 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 All about monads en donne une excellente couverture. Pour compléter votre formation de monade, il est indispensable de connaître les transformateurs de monades. Celles-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ébut, mais après les avoir utilisés pendant un moment, vous vous demanderez comment vous avez vécu sans eux.
Maintenant, vous pouvez finir le livre du monde réel Haskell si vous le souhaitez. Ignorer des chapitres maintenant n'a pas vraiment d'importance, tant que vous avez une monade en l'air. Il suffit de choisir ce qui vous intéresse.
Avec les connaissances que vous avez maintenant, vous devriez pouvoir utiliser la plupart des paquets sur cabale (enfin ceux au moins documentés ...), 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. Bien mieux que d’utiliser les expressions rationnelles. Excellente documentation, a également un chapitre du monde réel Haskell.
QuickCheck : Un programme de test très cool. Ce que vous faites est d'écrire un prédicat qui devrait toujours être vrai (par exemple length (reverse lst) == length lst
). Vous passez ensuite le prédicat QuickCheck, il générera beaucoup 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 : Test unitaire à Haskell.
gtk2hs : Le framework d'interface graphique le plus répandu pour Haskell vous permet d'écrire des applications gtk en Haskell.
happstack : Un framework de développement web pour Haskell. N'utilise pas de base de données, mais un magasin de type de données. Très bonne documentation (les autres frameworks populaires seraient snap et yesod ).
En outre, il existe de nombreux concepts (tels que le concept Monad) que vous devriez éventuellement apprendre. Ce sera plus facile que d’apprendre des monades la première fois, car votre cerveau sera habitué à faire face au niveau d’abstraction impliqué. Le Typeclassopedia est un très bon aperçu de l'apprentissage de ces concepts de haut niveau et de leur association.
Applicatif: Une interface semblable à Monads, mais moins puissante. Chaque Monade est Applicative, mais pas l'inverse. Ceci est utile car certains types sont d'application mais ne sont 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, foncteurs applicatifs et monoïdes dans le guide de familiarisation haskell.
Foldable , Traversable : Les classes de types qui abstraits de nombreuses opérations de listes permettent aux mêmes fonctions de s'appliquer à d'autres types de conteneurs. Voir aussi le explication du wiki haskell .
Monoid : Un Monoid est un type qui a une valeur zéro (ou mempty), et une opération notée <>
qui relie deux Monoids, de sorte que x <> mempty = mempty <> x = x
et x <> (y <> z) = (x <> y) <> z
. Celles-ci sont appelées lois d'identité et d'associativité. De nombreux types sont monoïdes, tels que des nombres, avec mempty = 0
et <> = +
. Ceci est utile dans de nombreuses situations.
Flèches : Les flèches sont un moyen de représenter des calculs qui prennent une entrée et retournent une sortie. Une fonction est le type de flèche le plus élémentaire, mais il en existe de nombreux autres. 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 sont utilisées uniquement avec des fonctions Haskell anciennes et simples.
Tableaux : les divers tableaux mutables/immuables de Haskell.
ST Monad : vous 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 méthode expérimentale d’écriture de code qui gère les événements, les déclencheurs, les entrées et les sorties (comme un gui). Je ne sais pas grand chose à ce sujet cependant. 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 juste les énumérer, vous pouvez trouver beaucoup d’informations à leur sujet sur google, le haskell wikibook , le site haskellwiki.org et documentation de ghc .
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 Théorie des catégories pour informaticien . Si vous ne voulez pas acheter le livre, le lien de l'auteur article est également excellent.
Enfin, vous voudrez en savoir plus sur les différents outils Haskell. Ceux-ci inclus:
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 (par exemple, un petit jeu, un analyseur de données, un site Web, compilateur ). Travailler dessus vous permettra d’appliquer beaucoup des choses que vous apprenez maintenant. Vous restez à ce niveau pendant des années (c'est là où je suis).
Expert
Cela vous prendra des années pour arriver à ce stade (bonjour de 2009!), Mais à partir de là, je suppose que vous commencez à écrire des articles, des nouvelles extensions ghc et à proposer de nouvelles abstractions.
Obtenir de l'aide
Enfin, à n'importe quel stade de l'apprentissage, il existe plusieurs endroits pour obtenir des informations. Ceux-ci sont:
Conclusion
Eh bien, cela s’est avéré plus long que prévu ... De toute façon, 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 en le faisant une toute nouvelle façon de penser. Ce n'est pas comme apprendre Ruby après Java, mais comme apprendre Java après C. ". En outre, 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 beaucoup de nouvelles façons d’abstraire des idées.
Un de mes collègues avait une bonne expérience avec Learn You a Haskell for Great Good! .
Tutoriel destiné aux personnes ayant une expérience des langages de programmation impératifs mais n'ayant jamais programmé dans un langage fonctionnel.
Et vérifiez les réponses ici aussi
Voici un bon livre que vous pouvez lire en ligne: Real World Haskell
La plupart des programmes Haskell que j'ai réalisés ont pour but de résoudre Project Euler .
Un conseil que j’avais lu il n’ya pas si longtemps était que vous devriez avoir un ensemble standard de problèmes simples que vous savez résoudre (en théorie), puis chaque fois que vous essayez d’apprendre une nouvelle langue, vous implémentez ces problèmes dans cette langue.
J'ai aimé regarder cette série de 13 épisodes sur la programmation fonctionnelle en utilisant Haskell.
C9 Conférences: Dr. Erik Meijer - Principes fondamentaux de la programmation fonctionnelle: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals -Chapitre-1/
Pour ajouter les réponses des autres, il existe un outil utile qui vous aidera lors du codage (par exemple lors de la résolution de problèmes liés au projet Euler): Hoogle . Vous pouvez utiliser l'interface de ligne de commande ou le interface Web .
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 appliquez-la sur le résultat et sur ce résultat, etc., et obtenez une liste infinie de ces valeurs. Vous pensez qu'il existe déjà une fonction pour vous aider (pas spécifiquement pour votre f
).
Cette fonction serait de type (a -> a) -> a -> [a]
si elle prend f 5
ou a -> (a -> a) -> [a]
si elle prend 5 f
(nous supposons que la fonction concerne des types généraux et pas seulement Int
s)
$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]
eh oui, la fonction dont vous avez besoin existe déjà et s'appelle iterate
. vous l'utilisez par iterate func 5
!
Le résultat pour le même exemple peut être trouvé ici .
La Programmation en Haskell de Graham Hutton est concise, raisonnablement approfondie et ses années d'enseignement de Haskell le montrent bien. C'est presque toujours ce que je recommande aux gens à commencer, peu importe où vous allez à partir de là.
En particulier, le chapitre 8 ("Analyseurs fonctionnels") fournit les bases véritables dont vous avez besoin pour commencer à traiter avec les monades, et je pense que c'est de loin le meilleur endroit pour commencer, suivi de All About Monads . (Cependant, en ce qui concerne ce chapitre, notez les errata du site Web: vous ne pouvez pas utiliser le formulaire do
sans une aide spéciale. Vous voudrez peut-être tout d’abord en savoir plus sur les classes de types et résoudre ce problème sur le tien.)
Ceci est rarement souligné par les débutants en Haskell, mais il vaut la peine d'apprendre assez tôt, pas seulement pour utiliser des monades, mais aussi pour construire votre propre. Ce n'est pas difficile, et les tâches personnalisées peuvent simplifier un certain nombre de tâches.
N'essayez pas de lire tous les tutoriels sur la monade avec des métaphores amusantes. Ils vont juste vous faire confondre encore plus.
Je suggèrerais de rejoindre le # haskell irc channel et de poser des questions. C'est comme ça que j'ai appris Haskell. Si vous passez par Real World Haskell comme suggéré ci-dessus, des réponses en temps réel à vos questions vous seront très utiles. Beaucoup de gens intelligents sur #haskell écrivent Haskell pour le plaisir et pour le profit, vous obtiendrez donc beaucoup de bonnes contributions. Essayez le!
Ce sont mes préférés
Haskell: Programmation fonctionnelle avec types
Joeri van Eekelen, et al. | Wikibooks
Published in 2012, 597 pages
B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
Published in 2008, 710 pages
Je peux également vous recommander --- [Encore un autre tutoriel Haskell en guise d'introduction.
Une autre bonne ressource d’apprentissage (probablement au 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 Brent Yorgey Typeclassopedia, qui peut être trouvé dans [Le lecteur Monad] (numéro 13)
Il est écrit dans un style très accessible et contient (entre autres choses) les conseils d’introduction suivants:
La sagesse d’un pirate informatique expert Haskell repose sur deux éléments clés:
Comprendre les types.
Acquérir une intuition profonde pour chaque classe de types et sa relation avec les autres classes de types, confortée par la connaissance de nombreux exemples.
[Le lecteur Monad est en soi un véritable trésor pour les programmeurs fonctionnels (pas seulement les programmeurs Haskell).
Je pense vraiment que la réalisation de la fonctionnalité de Haskell par des exemples est la meilleure façon de commencer avant tout.
http://en.wikipedia.org/wiki/Haskell_98_features
Voici des classes difficiles comprenant des monades et des flèches
http://www.haskell.org/haskellwiki/Typeclassopedia
pour les problèmes réels et les projets plus importants, rappelez-vous les tags suivants: GHC (le compilateur le plus utilisé), Hackage (bibliothèqueDB), Cabal (système de construction), darcs (un autre système de construction).
Un système intégré peut vous faire gagner du temps: http://hackage.haskell.org/platform/
la base de données de paquets pour ce système: http://hackage.haskell.org/
Wiki du compilateur GHC: http://www.haskell.org/haskellwiki/GHC
Après Haskell_98_features et Typeclassopedia, je pense que vous pouvez déjà trouver et lire la documentation à leur sujet.
En passant, vous souhaiterez peut-être tester l'extension de certaines langues de GHC, qui fera peut-être partie du standard haskell à l'avenir.
c'est ma meilleure façon d'apprendre haskell. J'espère que cela peut vous aider.
Essayez d’y écrire des programmes faciles.
Vous pouvez probablement trouver des exemples de tâches dans divers manuels.
Je ne recommanderais pas de coller aux manuels Haskell/FP, essayez simplement de faire des choses simples: calculs, manipulations de chaînes, accès aux fichiers.
Après en avoir résolu une douzaine, j'ai brisé la glace :)
Après cela, lisez beaucoup sur les concepts avancés (Monads, Arrows, IO, structures de données récursives), car haskell est infini et il y en a beaucoup.
Je vous suggère de commencer par lire tutoriel de BONUS , puis par lire Real World Haskell (en ligne gratuitement) . Rejoignez le canal # Haskell IRC, sur irc.freenode.com et posez des questions. Ces personnes sont absolument amicales avec les débutants et m'ont beaucoup aidé au fil du temps. En outre, ici même sur SO est un excellent endroit pour obtenir de l'aide avec des choses que vous ne pouvez pas saisir! Essayez de ne pas vous décourager, une fois que vous aurez cliqué dessus, votre esprit sera renversé.
Le didacticiel de BONUS va vous préparer et vous préparer au frisson de sensations offert par Real World Haskell. Je te souhaite bonne chance!
Si vous ne connaissez que les langages impératifs/OO, je vous suggère d’utiliser un langage fonctionnel plus conventionnel comme point de départ. Haskell est vraiment différent et vous devez comprendre beaucoup de concepts différents pour aller n'importe où. Je suggère d'abord de s'attaquer à un langage de style ML (comme par exemple F #).
La première réponse est très bonne. Pour accéder au niveau Expert, vous devez effectuer un doctorat avec certains des experts eux-mêmes.
Je vous suggère de visiter la page Haskell: http://haskell.org . Vous y trouverez de nombreux documents et de nombreuses références aux éléments les plus récents de Haskell, approuvés par la communauté Haskell.