Démarrer avec Haskell

Pendant quelques jours, j’ai essayé de comprendre le paradigme de la functional programming dans Haskell. Je l’ai fait en lisant des tutoriels et en regardant des screencasts, mais rien ne semble vraiment s’en tenir. Maintenant, en apprenant divers langages impératifs / OO (comme C, Java, PHP), les exercices ont été un bon moyen pour moi de partir. Mais comme je ne sais pas vraiment ce que Haskell est capable de faire et parce 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 des exercices?

    Je vais commander ce guide en fonction du 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?), Donc c’est plutôt long.

    Débutant

    Tout d’abord, le haskell est capable de tout, avec assez de compétence. C’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 applications Web et aux guis.

    Cependant, certains problèmes sont plus faciles à écrire pour un débutant que pour d’autres. Les problèmes mathématiques et les programmes de processus de liste sont de bons candidats car ils ne requièrent que les connaissances les plus élémentaires pour pouvoir écrire.

    Tout d’abord, quelques bons guides pour apprendre les bases du haskell sont le didacticiel Happy Learn haskell et les 6 premiers chapitres de l’ apprentissage du haskell . En lisant ces derniers, c’est une très bonne idée de résoudre des problèmes simples avec ce que vous savez.

    La programmation Haskell à partir des premiers principes et la programmation en Haskell sont deux autres bonnes ressources. Ils ont tous deux des exercices pour chaque chapitre, vous avez donc 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 page de 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 pratiquer vos compétences en récursivité et dans les fonctions d’ordre supérieur. Je recommanderais de sauter tous les problèmes qui nécessitent un caractère aléatoire, car cela est un peu plus difficile dans le cas des haskell. Cochez cette question si vous souhaitez tester vos solutions avec QuickCheck (voir Intermédiaire ci-dessous).

    Une fois que vous en avez fait quelques-uns, vous pouvez passer à quelques problèmes liés à Project Euler . Ceux-ci sont sortingés en fonction du nombre de personnes qui les ont complétés, ce qui est une assez bonne indication de la difficulté. Celles-ci testent votre logique et votre haskell plus que les problèmes précédents, mais vous devriez quand même pouvoir faire les premiers. Le grand 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 également les chapitres 7 et 8.

    Débutant

    Après cela, vous devriez avoir une assez bonne compréhension de la récursivité et des fonctions d’ordre supérieur, donc ce serait un bon moment pour commencer à faire des problèmes plus réels. Real World Haskell est un très bon sharepoint départ (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 functional programming / récursivité auparavant. Cependant, avec la pratique que vous auriez eu à faire les problèmes précédents, vous devriez le trouver parfaitement compréhensible.

    Travailler sur les problèmes du livre est un excellent moyen d’apprendre à gérer les abstractions et à créer des composants réutilisables dans le haskell. Ceci est vital pour les personnes habituées à la programmation orientée object (oo), car les méthodes normales d’abstraction (ou classes) n’apparaissent pas dans le haskell (haskell a des classes de type, mais elles sont très différentes des autres classes, plus comme les interfaces). ). Je ne pense pas que ce soit une bonne idée de sauter des chapitres, car ils introduisent beaucoup de nouvelles idées 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 le haskell ont du mal à comprendre les monades, car le concept est abstrait. Je ne peux penser à aucun concept dans un autre langage aussi abstrait que les monades dans la functional programming. Monads permet de regrouper de nombreuses idées (telles que les opérations IO, les calculs susceptibles d’échouer, l’parsing syntaxique, …) sous une seule idée. Alors 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 des monades; chacun donne une nouvelle perspective sur le problème. Voici une très bonne liste de tutoriels monades . Je recommande fortement le All About Monads , mais les autres sont également bons.

    En outre, il faut un certain temps pour que les concepts pénètrent véritablement. Cela passe par l’utilisation, mais aussi par le 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, en réalité, est incroyablement simple. C’est génial quand cela arrive, et quand c’est le cas, vous pourriez trouver que le haskell est votre langage de programmation impératif préféré 🙂

    Pour vous assurer que vous comprenez parfaitement le système de type Haskell, vous devriez essayer de résoudre 20 exercices intermédiaires de haskell . Ces exercices utilisant des noms amusants de fonctions telles que “furry” et “banana” vous aident à bien comprendre certains concepts de base de la functional programming si vous ne les avez pas déjà. Bon moyen de passer votre soirée avec une liste de papier recouvert de flèches, de licornes, de saucisses et de bananes à fourrure.

    Intermédiaire

    Une fois que vous avez compris Monads, je pense que vous avez fait la transition d’un programmeur haskell débutant à un haskeller intermédiaire. Alors, où aller d’ici? La première chose que je recommanderais (si vous ne les avez pas déjà apsockets en apprenant les monades), ce sont les différents types de monades, telles que Reader, Writer et State. Encore une fois, le haskell du monde réel et tout ce qui concerne les monades en offre une excellente couverture. Pour compléter votre formation monade, apprendre sur les transformateurs monad est un must. 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 certain temps, vous vous demanderez comment vous avez vécu sans eux.

    Maintenant, vous pouvez terminer le livre de haskell du monde réel si vous le souhaitez. Sauter les chapitres maintenant n’a pas vraiment d’importance, tant que vous avez des monades en l’air. Choisissez simplement ce qui vous intéresse.

    Avec les connaissances que vous auriez à présent, vous devriez pouvoir utiliser la plupart des paquets sur cabal (au moins ceux qui sont documentés, etc.), ainsi que la plupart des bibliothèques fournies avec haskell. Une liste de bibliothèques intéressantes à essayer serait:

    • Parsec : pour parsingr des programmes et du texte. Bien mieux que d’utiliser les regexps. 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 doit toujours être vrai (par exemple, length (reverse lst) == length lst ). Vous passez ensuite le prédicat quickCheck, qui générera beaucoup de valeurs aléatoires (dans ce cas, les listes) et testera que le prédicat est vrai pour tous les résultats. Voir aussi le manuel en ligne .

    • HUnit : Tests unitaires en haskell.

    • gtk2hs : Le framework d’ interface graphique 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 types de données. Assez bons docs (d’autres frameworks populaires seraient snap 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é. La Typeclassopedia est un très bon aperçu de ces concepts de haut niveau et de leur intégration .

    • Applicative: 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 ne sont pas des monades. De plus, le code écrit à l’aide des fonctions Applicatives est souvent plus modulable que l’écriture du code équivalent à l’aide des fonctions Monad. Voir les foncteurs, les foncteurs applicatifs et les monoïdes du guide d’apprentissage.

    • Pliable , Traversable : Classes qui résument beaucoup d’opérations de listes, de sorte que les mêmes fonctions puissent ê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 mémorable), et une opération notée <> qui relie deux monoïdes ensemble, telle 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 des monoïdes, tels que les nombres, avec mempty = 0 et <> = + . Ceci est utile dans de nombreuses situations.

    • Flèches : Les flèches permettent de représenter des calculs qui prennent une entrée et renvoient une sortie. Une fonction est le type de flèche le plus élémentaire, mais il existe de nombreux autres types. La bibliothèque dispose é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 de haskell.

    • Tableaux : les différents tableaux mutables / immuables en 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: Programmation Réactive Fonctionnelle, une nouvelle manière 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 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 depuis Google, le haskell wikibook , le site haskellwiki.org et la documentation ghc .

    • Classes de type multiparameters / dépendances fonctionnelles
    • Tapez les familles
    • Types quantifiés de manière existentielle
    • Types fantômes
    • GADTS
    • autres…

    Beaucoup de haskell sont basés sur la théorie des catégories , vous pouvez donc vous y intéresser. Un bon sharepoint départ est la théorie des catégories pour l’informaticien . Si vous ne voulez pas acheter le livre, l’ article lié à l’auteur 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)
    • cabal : le système de paquets de haskell
    • darcs : un système de contrôle de version dissortingbué écrit en haskell, très populaire pour les programmes de 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 en haskell. Cela peut être n’importe quoi (par exemple un petit jeu, un parsingur de données, un site Web, un compilateur ). Travailler sur cela vous permettra d’appliquer beaucoup de choses que vous apprenez maintenant. Vous restz à ce niveau pendant des siècles (c’est là que je suis).

    Expert

    Cela vous prendra des années pour arriver à cette étape (bonjour à partir de 2009!), Mais à partir de là, je devine que vous commencez à écrire des articles de phd, de nouvelles extensions de ghc et à en proposer de nouvelles.

    Obtenir de l’aide

    Enfin, à tout stade de l’apprentissage, il existe de nombreux endroits pour obtenir des informations. Ceux-ci sont:

    • le canal irc #haskell
    • les listes de diffusion . Cela vaut la peine de s’inscrire pour lire les discussions qui ont lieu – certaines sont très intéressantes.
    • autres lieux figurant sur la page d’accueil de haskell.org

    Conclusion

    Eh bien, cela a duré plus longtemps que prévu … En tout cas, 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 nouvelle façon de penser. Ce n’est pas comme apprendre le rbuy après avoir appris le java, mais comme apprendre le java après avoir appris c. De plus, je découvre que mes compétences en programmation orientée object se sont améliorées à la suite de l’apprentissage du haskell, car je vois beaucoup de nouvelles façons d’abstraction des idées.

    Un de mes collègues a eu une bonne expérience avec Learn You a Haskell pour Great Good! .

    Tutoriel destiné aux personnes qui ont de l’expérience dans les langages de programmation impératifs mais qui n’ont pas encore 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 étaient destinés à résoudre des problèmes liés au projet Euler .

    Une fois qu’un conseil que j’ai lu il n’y a pas si longtemps, c’est 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 un nouveau langage, vous implémentez ces problèmes dans cette langue.

    J’ai aimé regarder cette série de 13 épisodes sur la functional programming en utilisant Haskell.

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

    Pour append 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 l’ interface Web .

    Ligne de commande

    Après avoir installé la plate-forme Haskell, veillez à cabal install hoogle

    Exemple d’utilisation de Hoogle:

    Vous avez une fonction fx = 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 existe peut-être 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 assumons la fonction est pour les types généraux et pas seulement Int s)

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

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

    interface Web

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

    La programmation de Graham Hutton dans Haskell est concise, raisonnablement approfondie, et ses années d’enseignement d’Haskell se révèlent vraiment. C’est presque toujours ce que je recommande aux gens de commencer, peu importe où vous allez à partir de là.

    En particulier, le chapitre 8 (“Analyseurs fonctionnels”) fournit les véritables bases 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 sans aide spéciale. Vous voudrez peut-être en apprendre davantage sur les classes de caractères et résoudre le problème vous-même.)

    Cela est rarement souligné par les débutants de Haskell, mais cela vaut la peine d’apprendre assez tôt, non seulement sur l’utilisation des monades, mais aussi sur la construction de la vôtre. 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 avec des métaphores amusantes. Ils ne feront que vous empirer les choses.

    Je suggère de rejoindre la chaîne #haskell irc et d’y poser des questions. C’est comme ça que j’ai appris Haskell. Si vous passez par Real World Haskell comme suggéré ci-dessus, les 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, donc vous aurez beaucoup de bons commentaires. 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 

    Monde réel Haskell

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

    Je peux également recommander Yet Another Haskell Tutorial comme introduction.

    Une autre bonne ressource d’apprentissage (probablement de niveau intermédiaire), qui m’a beaucoup aidé et qui n’a pas été mentionnée dans les autres réponses, est Typeclassopedia de Brent Yorgey , disponible dans The Monad Reader (Issue 13)

    Il est écrit dans un style très accessible et contient (entre autres choses) les conseils d’introduction suivants:

    Il y a deux clés à la sagesse d’un expert Haskell:

    1. Comprendre les types

    2. Obtenez une intuition profonde pour chaque classe de type et sa relation avec les autres classes de types, appuyées par de nombreux exemples.

    Le Monad Reader lui-même est un véritable trésor pour les programmeurs fonctionnels (pas seulement les programmeurs Haskell).

    Essayez d’y écrire des programmes faciles.

    Vous pouvez trouver des exemples de tâches dans divers manuels, probablement.

    Je ne recommanderais pas de coller aux manuels Haskell / FP, essayez simplement de faire des choses simples: calculs, manipulations de chaînes, access aux fichiers.

    Après avoir résolu une douzaine, j’ai cassé la glace 🙂

    Après cela, lisez beaucoup de choses sur les concepts avancés (Monads, Arrows, IO, structures de données récursives), car le haskell est infini et il y en a beaucoup.

    Je pense que la meilleure façon de démarrer avant tout est d’expliquer la caractéristique de Haskell.

    http://en.wikipedia.org/wiki/Haskell_98_features

    Voici des classes de caractères délicates 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 ces balises: GHC (compilateur le plus utilisé), Hackage (libraryDB), Cabal (système de construction), darcs (autre système de construction).

    Un système intégré peut vous faire gagner du temps: http://hackage.haskell.org/platform/

    la firebase database 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 voudrez peut-être tester l’extension de certaines langues du GHC, qui pourrait faire partie du standard de haskell à l’avenir.

    C’est mon meilleur moyen d’apprendre le haskell. J’espère que cela peut vous aider.

    Je vous suggère de commencer par lire le tutoriel de BONUS , puis de lire Real World Haskell (en ligne gratuitement) . Rejoignez le canal IRC #Haskell sur irc.freenode.com et posez des questions. Ces personnes sont absolument novices et m’ont beaucoup aidé au fil du temps. Aussi, ici même sur SO est un endroit idéal 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é, votre esprit sera soufflé.

    Le tutoriel de BONUS vous initiera et vous préparera à la course palpitante qu’apporte Real World Haskell. Je te souhaite bonne chance!

    Si vous avez uniquement de l’expérience avec les langages impératifs / OO, je suggère d’utiliser un langage fonctionnel plus conventionnel comme tremplin. Haskell est vraiment différent et vous devez comprendre beaucoup de concepts différents pour arriver à quelque chose. Je suggère d’aborder une langue de style ML (comme par exemple F #).

    La première réponse est très bonne. Pour accéder au niveau Expert, vous devez faire un doctorat avec certains des experts eux-mêmes.

    Je vous suggère de visiter la page Haskell: http://haskell.org . Vous y trouverez beaucoup de matériel et de nombreuses références aux informations les plus récentes de Haskell, approuvées par la communauté Haskell.