Introduction
À propos de ce tutoriel
Bienvenue dans Apprendre Haskell vous fera le plus grand bien ! Si vous lisez ceci, il est possible que vous souhaitiez apprendre Haskell. Vous êtes au bon endroit, mais discutons un peu de ce tutoriel avant tout.
J’ai décidé d’écrire ce tutoriel parce que je voulais consolider ma propre connaissance d’Haskell, et parce que je pensais pouvoir aider les débutants à l’apprendre selon mon point de vue. Il y a plusieurs tutoriels traitant de Haskell qui traînent sur Internet. Quand je débutais en Haskell, je n’ai pas appris que d’une seule source. Ma méthode d’apprentissage consistait à lire plusieurs tutoriels et articles, car chacun d’eux expliquait d’une manière un peu différente de l’autre. En confrontant plusieurs ressources, j’ai pu assembler les pièces du puzzle et tout s’est mis à sa place. Ceci est une tentative visant à produire une ressource de plus afin d’apprendre Haskell, de sorte que vous ayez plus de chance d’en trouver une que vous appréciez.
Ce tutoriel vise les personnes ayant de l’expérience dans un langage de programmation impérative (C, C++, Java, Python, …) mais qui n’ont jamais programmé dans un langage de programmation fonctionnel auparavant (Haskell, ML, OCaml, …).
Bien que je me doute que même sans vraie expérience en programmation, une chouette personne comme vous pourra suivre et apprendre Haskell.
Le canal #haskell sur le réseau freenode est un bon endroit pour poser des questions si vous êtes bloqué (NdT: Le canal #haskell-fr du même réseau vous permettra de poser vos questions en français). Les gens y sont extrêmement gentils, patients et compréhensifs envers les débutants.
J’ai échoué dans mon apprentissage de Haskell à peu près deux fois avant d’arriver à le saisir, car cela me semblait trop bizarre et je ne comprenais pas. Mais alors, j’ai eu le déclic, et après avoir passé cet obstacle initial, le reste est venu plutôt facilement. Ce que j’essaie de vous dire : Haskell est génial, et si vous êtes intéressés par la programmation, vous devriez l’apprendre même si cela semble bizarre au début. Apprendre Haskell est très similaire à l’apprentissage de la programmation la première fois – c’est fun ! Ça vous force à penser différemment, ce qui nous amène à la section suivante…
Donc, qu’est-ce qu’Haskell ?
Haskell est un langage de programmation fonctionnel pur. Dans les langages impératifs, vous effectuez des choses en donnant à l’ordinateur une séquence de tâches, et il les exécute. Lors de cette exécution, il peut changer d’état. Par exemple, vous affectez à une variable a la valeur 5, puis vous faites quelque chose, puis lui affectez une autre valeur. Vous avez des structures de contrôle de flot pour répéter des actions plusieurs fois. Dans un langage de programmation fonctionnel pur, vous n’indiquez pas à l’ordinateur quoi faire, mais plutôt ce que les choses sont. La factorielle d’un nombre est le produit de tous les nombres de 1 à celui-ci, la somme d’une liste de nombres est égale au premier de ceux-ci additionné à la somme des autres, etc. Vous exprimez ceci sous la forme de fonctions.
Également, vous n’affectez pas une valeur à une variable, puis une autre valeur plus tard. Si vous dites que a est égal à 5, vous ne pouvez pas dire qu’il est égal à autre chose plus tard, car vous venez de dire qu’il était égal à 5. Quoi, vous êtes un menteur ? Donc, dans les langages fonctionnels purs, une fonction n’a pas d’effets de bord. La seule chose qu’une fonction puisse faire, c’est calculer quelque chose et retourner le résultat. Au départ, cela semble plutôt limitant, mais il s’avère que ça a de très intéressantes conséquences : si une fonction est appelée deux fois, avec les mêmes paramètres, alors il est garanti qu’elle renverra le même résultat. On appelle ceci la transparence référentielle, et cela permet non seulement au compilateur de raisonner à propos du comportement du programme, mais également à vous de déduire facilement (et même de prouver) qu’une fonction est correcte, puis de construire des fonctions plus complexes en collant de simples fonctions l’une à l’autre.
Haskell est paresseux. Cela signifie qu’à moins de lui demander explicitement, Haskell n’exécutera pas les fonctions et ne calculera pas les choses tant qu’il n’est pas forcé de nous montrer les résultats. Cela va bien de pair avec la transparence référentielle et permet de penser ses programmes comme des transformations sur des données. Cela permet aussi des choses cool comme des structures de données infinies. Supposons que vous ayez une liste de nombres immuable xs = [1, 2, 3, 4, 5, 6, 7, 8] et une fonction doubleMe qui multiplie chaque élément par 2 et retourne la nouvelle liste. Si nous voulions multiplier notre liste par 8 dans un langage impératif en faisant doubleMe (doubleMe(doubleMe(xs))), il traverserait probablement la liste une fois, ferait une copie, et la retournerait.
Puis, il traverserait cette liste encore deux fois et retournerait le résultat. Dans un langage paresseux, appeler doubleMe sur une liste sans la forcer à s’afficher résulte en gros à ce que le programme vous dise “Ouais ouais, je le ferai plus tard !”. Mais dès que vous voulez voir le résultat, le premier doubleMe dit au deuxième qu’il a besoin du résultat, maintenant! Le deuxième le dit à son tour au troisième, et le troisième, avec réticence, renvoie un 1 doublé, qui est donc un 2. Le deuxième reçoit cela, et renvoie un 4 au premier. Le premier voit cela, et vous répond que le premier élément est un 8. Ainsi, la liste n’est traversée qu’une fois, et seulement quand vous en avez vraiment
….
Apprendre Haskell (5.3 Mo) (Cours PDF)