Pendant quelques jours, j'ai essayé de faire le tour du paradigme de la programmation fonctionnelle dans Haskell. Je l'ai fait en lisant des didacticiels et en regardant des captures d'écran, 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 ne sais pas par où commencer.
Alors, comment avez-vous appris Haskell? Qu'est-ce qui vous a vraiment fait "casser la glace"? Aussi, de bonnes idées pour commencer les exercices?
Réponses:
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 quex <> mempty = mempty <> x = x
etx <> (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, avecmempty = 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 .
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:
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:
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.
la source
Monad
est plus puissant, mais aussi moins compositionnel ... beaucoup de gens utilisent des monades où ils auraient pu s'en tirer avec unApplicative
code plus propre . La plupart des choses qui sont desFunctor
s sont également desMonad
s, mais vous ne faites pas le tour en utilisant>>=
etreturn
quandfmap
cela suffira, car ce dernier conduit à un code beaucoup plus simple si vous pouvez l'utiliser.Un de mes collègues avait une bonne expérience avec Learn You a Haskell for Great Good! .
Et vérifiez les réponses ici aussi
la source
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 été destinés à résoudre des problèmes liés au projet Euler .
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), puis chaque fois que vous essayez d'apprendre une nouvelle langue, vous implémentez ces problèmes dans cette langue.
la source
J'ai aimé regarder cette série de 13 épisodes sur la programmation fonctionnelle avec Haskell.
Conférences C9: Dr. Erik Meijer - Fondements de la programmation fonctionnelle: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/
la source
Pour ajouter les réponses des autres - il y en a un qui vous aidera lors du codage (par exemple lors de la résolution des problèmes du 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, 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(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 votref
bien).Cette fonction serait de type
(a -> a) -> a -> [a]
si elle prendf 5
oua -> (a -> a) -> [a]
si elle prend5 f
(nous supposons que la fonction est pour les types généraux et pas seulementInt
s)oui, la fonction dont vous avez besoin existe déjà et elle s'appelle
iterate
. vous l'utilisez pariterate func 5
!interface Web
Le résultat pour le même exemple peut être trouvé ici .
la source
La programmation de Graham Hutton à Haskell est concise, raisonnablement approfondie, et ses années d'enseignement de Haskell le montrent vraiment. C'est presque toujours ce que je recommande aux gens de commencer, peu importe où vous allez.
En particulier, le chapitre 8 ("Analyseurs fonctionnels") fournit le véritable fondement 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 . (En ce qui concerne ce chapitre, cependant, notez les errata du site Web, cependant: vous ne pouvez pas utiliser le
do
formulaire sans une aide spéciale. Vous voudrez peut-être d'abord vous renseigner sur les classes de caractères et résoudre ce problème par vous-même.)Cela est rarement souligné par les débutants Haskell, mais cela vaut la peine d'apprendre assez tôt non seulement sur l'utilisation des monades, mais 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.
la source
N'essayez pas de lire tous les tutoriels de monade avec des métaphores amusantes. Ils vous embrouilleront encore plus.
la source
Je suggère de rejoindre la chaîne #haskell irc et d'y poser des questions. C'est ainsi 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 aideront grandement. Beaucoup de gens intelligents sur #haskell écrivent Haskell pour le plaisir et pour le profit, vous obtiendrez donc beaucoup de bonnes contributions. Essayez!
la source
Ce sont mes préférés
Haskell: Programmation fonctionnelle avec types
Real World Haskell
la source
Je peux également recommander Yet Another Haskell Tutorial comme introduction.
Une autre bonne ressource d'apprentissage (probablement au niveau intermédiaire), qui m'a beaucoup aidé et n'a pas été mentionnée dans les autres réponses pour autant que je puisse voir, est Typeclassopedia de Brent Yorgey , qui se trouve 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:
Le Monad Reader lui-même est un véritable trésor pour les programmeurs fonctionnels (pas seulement les programmeurs Haskell).
la source
Essayez d'y écrire des programmes faciles.
Vous pouvez probablement trouver des exemples de tâches dans divers manuels.
Je ne recommanderais pas de m'en tenir aux manuels Haskell / FP, essayez simplement de faire des choses simples avec: calculs, manipulations de chaînes, accès aux fichiers.
Après avoir résolu une douzaine, j'ai brisé la glace :)
Après cela, lisez beaucoup sur les concepts avancés (Monades, Flèches, IO, structures de données récursives), car haskell est infini et il y en a beaucoup.
la source
Je pense que réaliser la fonctionnalité de Haskell par des exemples est le meilleur moyen de commencer par-dessus tout.
http://en.wikipedia.org/wiki/Haskell_98_features
Voici des classes délicates comprenant des monades et des flèches
http://www.haskell.org/haskellwiki/Typeclassopedia
pour les problèmes du monde réel et les projets plus importants, n'oubliez pas ces balises: GHC (compilateur le plus utilisé), Hackage (libraryDB), 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 des packages 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
Soit dit en passant, vous voudrez peut-être tester l'extension de certaines langues de GHC qui pourrait faire partie de la norme haskell à l'avenir.
c'est ma meilleure façon d'apprendre le haskell. J'espère que cela peut vous aider.
la source
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 gens sont très sympathiques pour les débutants et m'ont beaucoup aidé au fil du temps. De plus, ici 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 qu'il cliquera, votre esprit sera époustouflé.
Le didacticiel de BONUS vous amorcera et vous préparera pour le voyage passionnant qu'apporte Real World Haskell. Je te souhaite bonne chance!
la source
Si vous n'avez qu'une 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 de nombreux concepts différents pour arriver n'importe où. Je suggère d'aborder un langage de style ML (comme par exemple F #).
la source
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 . Là vous avez beaucoup de matériel, et beaucoup de références aux trucs les plus à jour à Haskell, approuvés par la communauté Haskell.
la source