Pour commencer avec Haskell

pendant quelques jours, j'ai essayé de me concentrer sur le paradigme de la programmation fonctionnelle à Haskell. J'ai fait cela en lisant des tutoriels et en regardant des screencasts, mais rien ne semble vraiment coller. Maintenant, en apprenant diverses langues impératives/OO (comme le 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 qu'il y a beaucoup de nouveaux concepts à utiliser, Je ne sais pas par où commencer.

So, comment avez-vous appris Haskell? Qu'est-ce qui vous a vraiment fait "briser la glace"? Aussi, de bonnes idées pour commencer les exercices?

758
demandé sur anderstornvig 2009-06-18 17:17:11

15 réponses

je vais commander ce guide par le niveau de compétence que vous avez en haskell, pour aller d'un débutant jusqu'à l'expert. Notez que ce processus prendra de nombreux mois (des années?), donc c'est plutôt long.

Débutant

tout d'Abord, haskell est capable de tout, avec assez d'habileté. Il est très rapide (derrière seulement c et c++ dans mon expérience), et peut être utilisé pour n'importe quoi, des simulations aux serveurs, et des applications web.

cependant, il y a certains problèmes qui sont plus faciles à écrire pour un débutant à haskell que 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 la connaissance la plus fondamentale de Haskell pour être en mesure d'écrire.

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

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

un bon liste des problèmes à essayer est le haskell 99 page . Ceux-ci commencent très basique, et deviennent plus difficile 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écursion et les fonctions d'ordre supérieur. Je recommande de sauter tous les problèmes qui exigent le caractère aléatoire car c'est un peu plus difficile à haskell. Cochez cette question SO si vous souhaitez tester vos solutions avec QuickCheck (voir Intermédiaire ci-dessous).

une fois que vous avez fait quelques-uns de ces, vous pourriez passer à faire quelques-uns des projet Euler problèmes. Ceux-ci sont classés selon le nombre de personnes qui les ont complétés, ce qui est une assez bonne indication de la difficulté. Ces tester votre logique et haskell plus que les problèmes précédents, mais vous devriez toujours être en mesure de faire les premiers. Un grand avantage haskell a avec ces problèmes est entiers ne sont pas limitée en taille. Pour la réalisation de certains de ces problèmes, il sera utile d'avoir lu les chapitres 7 et 8 de vous apprendre un haskell.

débutant

après que vous devriez avoir une assez bonne poignée sur la récursion et les fonctions d'ordre supérieur, de sorte qu'il serait un bon moment pour commencer à faire quelques problèmes plus du monde réel. Un très bon endroit pour commencer est monde réel Haskell (Livre en ligne, vous pouvez également acheter une copie papier). J'ai trouvé les premiers chapitres introduisent beaucoup trop rapidement pour quelqu'un qui n'a jamais fait de programmation fonctionnel/used récursion avant. Toutefois, 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 du livre est une excellente façon d'apprendre à gérer les abstractions et à construire des composants réutilisables à haskell. C'est essentiel pour les gens orientée objet (oo) la programmation, comme les méthodes normales d'abstraction oo (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 ultérieurs.

après un certain temps vous arriverez au chapitre 14, le chapitre redouté des monades (dum dum dummmm). Presque tous ceux qui apprennent haskell a du mal à comprendre les monades, en raison de comme le concept est abstrait. Je ne vois pas de concept dans un autre langage aussi abstrait que les monades dans la programmation fonctionnelle. Les monades permettent de nombreuses idées (comme les opérations IO, les calculs qui pourraient échouer, l'analyse, etc.)...) à être unifié 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 des monades; chacun donne une nouvelle perspective sur le problème. Voici un très bon liste de monade "tutoriels 1519180920" . Je recommande fortement le tout sur les monades , mais les autres sont également bons.

aussi, il faut un certain temps pour que les concepts s'enfoncent vraiment. Cela vient de l'utilisation, mais aussi à travers le temps. Je trouve que parfois dormir sur un problème AIDE plus que n'importe quoi d'autre! 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. Il est génial quand cela arrive, et quand il le fait, vous pourriez trouver haskell être votre favori language de programmation impératif :)

pour s'assurer que vous comprenez parfaitement le système de type Haskell, vous devriez essayer de résoudre 20 exercices intermédiaires haskell . Ces exercices utilisant des noms amusants de fonctions comme "furry" et "banana" et vous aide à avoir une bonne compréhension de certains concepts de base de 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, licornes, saucisses et bananes à fourrure.

Intermédiaire

une fois que vous avez compris les monades, je pense que vous avez fait la transition d'un programmeur Haskell débutant à un programmeur Haskell intermédiaire. Alors, où aller à partir d'ici? La première chose que je recommande (si vous ne les avez pas déjà appris de monades d'apprentissage) est les différents types de monades, tels que en tant que Lecteur, l'Écrivain et de l'État. Encore une fois, le monde réel haskell et tout sur les monades donne une grande couverture de ceci. Pour compléter votre formation monad apprendre sur les transformateurs monad est un must. Ceux-ci vous permettent de combiner différents types de monades (comme un lecteur et monade D'État) en un seul. Cela peut sembler inutile pour commencer, mais après avoir utilisé pendant un certain temps, vous vous demanderez comment vous avez vécu sans eux.

maintenant vous pouvez finir le livre du monde réel haskell si vous voulez. Sauter des chapitres maintenant mais ça n'a pas vraiment d'importance, du moment que tu as des monades en place. Il suffit de choisir ce qui vous intéresse.

Avec les connaissances que vous avez maintenant, vous devriez être en mesure d'utiliser la plupart des paquets sur cabal (bien documentés au moins...), ainsi que la plupart des bibliothèques qui viennent 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 les expressions régulières. Excellente documentation, a également un chapitre Haskell monde réel.

  • Quickcheck : Un très cool programme de test. Ce que vous faites est d'écrire un prédicat qui devrait toujours être vrai (par exemple length (reverse lst) == length lst ). Vous réussissez alors le QuickCheck de prédicat, et il générera beaucoup de valeurs aléatoires (dans ce cas-ci des listes) et tester que le prédicat est vrai pour tous les résultats. Voir aussi le en ligne manuel .

  • HUnit : les tests Unitaires en haskell.

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

  • happstack : Une infrastructure de développement web pour haskell. N'utilise pas de bases de données, mais plutôt un magasin de type de données. Assez bon docs (autres cadres populaires serait snap et yesod ).

il y a aussi de nombreux concepts (comme 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é au niveau d'abstraction impliqué. Un très bon aperçu pour en savoir plus sur ces concepts de haut niveau et comment ils s'intègrent est le Typeclassopedia .

  • applicatif: une interface comme des monades, mais moins puissante. Chaque monade est Applicative, mais pas l'inverse. Ceci est utile car il y a certains types qui sont applicatifs 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 du guide learn you a haskell.

  • Foldable , Traversable : classes typographiques qui abstraient un grand nombre des opérations des listes, de sorte que les mêmes fonctions peuvent être appliquées à d'autres types de conteneurs. Voir aussi l'explication Haskell wiki .

  • monoïde : un monoïde est un type qui a une valeur zéro (ou mempty), et une opération, notée <> qui réunit deux monoïdes, tels que x <> mempty = mempty <> x = x et x <> (y <> z) = (x <> y) <> z . Ces lois 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 sont une façon de représenter des calculs qui prennent une entrée et renvoient une sortie. Une fonction est le type le plus basique de flèche, mais il y a beaucoup d'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 vieilles fonctions Haskell.

  • "15191450920 des" Tableaux : les différents mutable/immuable tableaux en haskell.

  • ST Monad : permet d'écrire du code avec un état mutable qui tourne très rapidement, tout en restant pur en dehors de la monade. Voir le lien pour plus de détails.

  • PRF: Fonctionnel Réactif de Programmation, une nouvelle, expérimentale façon d'écrire le code qui gère les événements, les déclencheurs, entrées et sorties (comme une interface graphique (gui). Je ne sais pas beaucoup au sujet de ce bien. Paul Hudak parler de la yampa est un bon début.

Il ya beaucoup de nouvelles fonctionnalités de langue vous je devrais jeter un oeil. Je vais juste les énumérer, vous pouvez trouver beaucoup d'informations à leur sujet de google, le Haskell wikibook , le haskellwiki.org site and ghc documentation .

  • classes de type multiparamètres /dépendances fonctionnelles
  • familles types
  • quantifiée Existentiellement types
  • Fantôme "types de 1519780920"
  • GADTS
  • les autres...

beaucoup de haskell est basé autour de théorie des catégories , donc vous pouvez vouloir regarder dans cela. Un bon point de départ est théorie des catégories pour les informaticiens . Si vous ne voulez pas acheter le livre, le article de l'auteur est également excellent.

enfin, vous souhaitez en savoir plus sur les différents outils haskell. Il s'agit notamment de:

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

tout en apprenant tous ces nouveaux concepts et bibliothèques, il est très utile d'écrire un projet de taille moyenne à haskell. Il peut être n'importe quoi (par exemple un petit jeu, analyseur de données, site web, compilateur ). Travailler sur ce qui vous permettra d'appliquer beaucoup de choses que vous êtes en train d'apprendre. Vous restez à ce niveau pendant des âges (c'est ici que je suis).

Expert

Il faudra des années pour arriver à ce scène (bonjour depuis 2009!), mais à partir de là, je suppose que vous commencez à écrire des articles de doctorat, de nouvelles extensions de ghc, et de venir avec de nouvelles abstractions.

Obtenir De L'Aide

enfin, bien qu'à n'importe quel stade de l'apprentissage, il existe plusieurs endroits pour obtenir de l'information. Ce sont:

  • le #haskell canal irc
  • le listes de diffusion . Ces valent la peine signature juste de lire les discussions qui ont lieu au - certains sont très intéressants.
  • haskell.org page d'accueil

Conclusion

ça a duré plus longtemps que prévu... Quoi qu'il en soit, je pense que c'est une très bonne idée de devenir compétent en haskell. Il prend beaucoup de temps, mais c'est principalement parce que vous êtes l'apprentissage d'une nouvelle manière de penser par de le faire. 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 à la suite de l'apprentissage de haskell, car je vois de nombreuses nouvelles façons d'abstraire des idées.

2346
répondu David Miani 2018-02-11 16:14:09

un de mes collègues a eu une bonne expérience avec apprenez-vous un Haskell pour le bien! .

Tutoriel destiné aux personnes qui ont expérience en programmation impérative langues mais n'ont pas été programmées depuis langage fonctionnel avant.

Et cochez les réponses ici trop

172
répondu jitter 2017-05-23 12:18:22

voici un bon livre que vous pouvez lire en ligne: Real World 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 vous savez comment résoudre (en théorie) et puis chaque fois que vous essayez d'apprendre une nouvelle langue vous mettez en œuvre ces problèmes dans ce langue.

99
répondu David Johnstone 2009-06-18 13:19:38

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

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

70
répondu eevar 2010-06-05 11:37:28

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

Ligne De Commande

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

Hoogle exemple d'utilisation:

You disposent d'une fonction f x = 3 * x + 1 et que 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 soupçonnez qu'il pourrait déjà exister une fonction pour vous aider (pas spécifiquement pour votre f cependant).

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 est pour les types généraux et pas seulement Int s)

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

yep, 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 pour le même exemple peut être trouvé ici .

66
répondu yairchu 2014-08-12 07:11:56

Graham Hutton Programmation Haskell est concis, raisonnablement complet, et ses années d'enseignement Haskell vraiment montrer. 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 ("parseurs fonctionnels") fournit le vrai travail de base dont vous avez besoin pour commencer à traiter avec les monades, et je pense est de loin le meilleur endroit pour commencer, suivi par tout sur les monades . (En ce qui concerne ce chapitre, cependant, ne notez pas l'errata du site web, cependant: vous ne pouvez pas utiliser le formulaire do sans une aide spéciale. Vous pourriez apprendre sur typeclasses première et de résoudre le problème sur votre propre.)

cela est rarement souligné pour les débutants de Haskell, mais il vaut la peine d'apprendre assez tôt non seulement sur l'utilisation de monades, mais sur la construction de votre propre. Il n'est pas difficile, et personnalisés peuvent faire un certain nombre de tâches plus simples.

53
répondu Curt Sampson 2014-10-21 10:44:27

N'essayez pas de lire tous les tutoriels monad avec de drôles de métaphores. Ils vont juste vous confondre encore pire.

50
répondu John Smith 2009-06-18 13:23:09

je suggère de rejoindre le canal irc #haskell et d'y poser des questions. C'est comme ça que J'ai appris Haskell. Si vous passez par le monde réel Haskell comme suggéré ci-dessus, les réponses en temps réel à vos questions seront très utiles. Beaucoup de gens intelligents sur #haskell écrivent Haskell pour le plaisir et pour le profit, donc vous obtiendrez beaucoup de bonnes entrées. L'essayer!

30
répondu shapr 2009-06-18 14:28:52

ce sont mes préférés

Haskell: la Programmation Fonctionnelle avec des Types

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

Real World Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages
22
répondu Soner Gönül 2013-06-20 13:10:32

je peux en outre recommander encore un autre tutoriel Haskell comme une 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 autant que je puisse voir , est Typeclassopedia de Brent Yorgey, que L'on peut trouver dans the Monad Reader (numéro 13)

il est écrit dans un style très accessible et contient (entre autres choses), le Conseil d'introduction suivant:

il y a deux clés à la sagesse d'un Haskell hacker expert:

  1. comprendre les types.

  2. acquérir une intuition profonde pour chaque classe de type et sa relation à l'autre les classes de type, étayées par la familiarité avec de nombreux exemples.

the Monad Reader en soi est un trésor absolu pour les programmeurs fonctionnels (pas seulement Haskell programmeurs).

18
répondu Greg S 2015-09-06 16:54:48

essayez d'y écrire des programmes faciles.

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

Je ne recommande pas de s'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 que j'ai résolu une dizaine, j'ai cassé la glace :)

après cela, lisez beaucoup sur les concepts avancés (monades, flèches, IO, structures de données récursives), parce que haskell est infini et il y en a beaucoup.

13
répondu alamar 2009-06-18 13:19:04

je pense que la réalisation de la caractéristique de Haskell par des exemples est la meilleure façon de commencer par-dessus tout.

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

Voici des typeclasses délicates, y compris des monades et des flèches

http://www.haskell.org/haskellwiki/Typeclassopedia

pour les problèmes du monde réel et plus grand projet, rappelez-vous ces étiquettes: GHC(la plupart compilateur 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 paquets pour ce système: http://hackage.haskell.org /

GHC compiler's wiki: http://www.haskell.org/haskellwiki/GHC

après Haskell_98_features et Typeclassopedia, je pense que vous pouvez déjà trouver et de lire la documentation à propos de vous-même

soit dit en passant, vous voudrez peut-être tester une extension des langues du GHC qui pourrait faire partie de la norme haskell à l'avenir.

c'est ma meilleure façon d'apprendre haskell. j'espère que cela peut vous aider.

13
répondu snowcake and icejelly 2012-01-02 14:08:44

je vous suggère de commencer par lire tutoriel BONUS , puis de lire Haskell monde réel (en ligne gratuitement) . Rejoignez le #Haskell IRC channel, on irc.freenode.com , et poser des questions. Ces gens sont vraiment sympas avec les débutants, et m'ont beaucoup aidé au fil du temps. Aussi, ici, il y a 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 qu'il clique, votre esprit être soufflé.

BONUS ' tutoriel va vous préparer, et vous préparer pour le voyage passionnant que le monde réel Haskell apporte. Je vous souhaite bonne chance!

12
répondu Rayne 2009-06-18 23:19:49

si vous n'avez que de l'expérience avec les langues impératives/OO, je suggère d'utiliser un langage fonctionnel plus conventionnel comme tremplin. Haskell est vraiment différent et vous devez comprendre beaucoup de différents concepts pour obtenir n'importe où. Je suggère de s'attaquer d'abord à un langage de style ML (comme par exemple F#).

11
répondu JacquesB 2009-06-21 21:01:56

la première réponse est très bonne. Afin d'accéder au niveau D'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 choses les plus à jour à Haskell, approuvé par la communauté de Haskell.

9
répondu Fidel 2012-12-21 07:59:04