Haskell est-il un langage de programmation plus difficile à apprendre que les autres langages ? Non, selon William Yao, un programmeur Haskell. William Yao estime que le langage Haskell est abordable pour tout le monde, mais que c’est la manière dont les choses sont faites qui intimide les gens, principalement le manque de documentation solide pour de nombreuses bibliothèques populaires.
Qu’est-ce que le langage Haskell ?
Haskell est un langage de programmation purement fonctionnel. Il est fondé sur le lambda-calcul et la logique combinatoire. Son nom vient du mathématicien et logicien Haskell Brooks Curry. Il a été créé en 1990 par un comité de chercheurs en théorie des langages intéressés par les langages fonctionnels et l'évaluation paresseuse. Purement fonctionnel ? En effet, dans les autres langages qualifiés d’impératifs, vous obtenez des résultats en donnant à l'ordinateur une séquence de tâches, puis il les exécute. Pendant leur exécution, il peut changer d'état.
Par exemple, vous mettez la variable x à 5, puis vous faites quelque chose et vous la mettez à autre chose. Plus encore, vous disposez de structures de flux de contrôle pour effectuer certaines actions plusieurs fois. Dans la programmation purement fonctionnelle, vous ne dites pas à l'ordinateur ce qu'il doit faire en tant que tel, mais plutôt en quoi consiste le contenu. Le factoriel d'un nombre est le produit de tous les nombres de 1 à ce nombre, la somme d'une liste de nombres est le premier nombre plus la somme de tous les autres nombres, et ainsi de suite.
Vous l'exprimez sous forme de fonctions. Vous ne pouvez pas non plus mettre une variable quelque chose et ensuite la mettre à autre chose plus tard. Si vous dites que x vaut 5, vous ne pouvez plus dire qu’il vaut autre chose plus tard parce que vous venez de dire que sa valeur était 5. Ainsi, dans les langages purement fonctionnels, une fonction n'a pas d'effets secondaires. La seule chose qu'une fonction peut faire est de calculer quelque chose et de le retourner comme résultat. À première vue, cela peut sembler limitatif, mais cela peut avoir de bonnes conséquences.
Si une fonction est appelée deux fois avec les mêmes paramètres, le résultat sera le même, c'est garanti. C'est ce qu'on appelle la transparence référentielle et non seulement elle permet au compilateur de raisonner sur le comportement du programme, mais elle permet aussi de déduire facilement (et même de prouver) qu'une fonction est correcte et de construire ensuite des fonctions plus complexes en collant des fonctions simples ensemble. Selon William Yao, cette logique n’est pas difficile à cerner lorsqu’on sait ce qu’il faut apprendre en premier.
Selon William Yao, l’apprentissage du Haskell paraît difficile parce que les gens ne parlent que des fonctionnalités avancées du langage
Il reconnaît que, si vous passiez d'un autre langage à Haskell ou si vous voulez écrire des programmes qui feront vraiment des choses, participer à la communauté Haskell peut vous donner l'impression d'être un citoyen de seconde classe. Selon lui, le manque de documentation solide pour de nombreuses bibliothèques populaires, ainsi quelques autres aspects peuvent donner l’impression aux gens qu’ils ont besoin d’avoir de deux doctorats en théorie des langages de programmation, juste pour écrire Hello World, mais l’apprentissage du Haskell demeure facile.
« Si vous avez déjà appris un autre langage, vous pouvez apprendre le Haskell. Et même si ce n’est pas le cas, apprendre Haskell n’est pas plus difficile que d’apprendre un autre langage de programmation », a déclaré William Yao. Selon lui, l’apprentissage du Haskell paraît difficile parce que les gens ne parlent que des fonctionnalités avancées du langage. Cela fait en sorte que la plupart des novices focalisent leur attention sur ces parties avancées lorsqu’ils sont amenés à apprendre le Haskell. Cela a pour conséquence négative de leur montrer la difficulté de la chose.
Ainsi, William Yao estime qu’il y a des parties que les experts pourraient qualifier « d’ennuyeuses », mais qui sont très importantes dans l’apprentissage du Haskell et qui peuvent servir à elles seules à écrire des programmes robustes. « Si vous enlevez cela [certaines parties avancées], vous constaterez que beaucoup de choses dont les gens parlent finissent par être inutiles pour écrire des programmes pratiques », a-t-il déclaré. Il propose d’ailleurs une liste de certaines de ces fonctions que vous n'avez pas besoin de comprendre pour écrire de vrais programmes Haskell :
- la théorie des catégories ;
- le calcul lambda ;
- l'évaluation paresseuse ;
- le paquet Lens ;
- les transformateurs monadiques ;
- l'algèbre à effets ;
- les schémas de récursivité ;
- la programmation de type ;
- etc.
Selon Yao, lorsqu’on enlève ces choses au début, l’apprentissage du langage devient alors tout simple. Cependant, il rappelle que le fait de ne pas avoir à apprendre ces concepts dès le départ ne signifie pas qu'il ne sert à rien de les apprendre un jour ni que vous devriez abandonner vos algèbres à effets et vos abstractions basées sur la théorie des catégories. Il a insisté sur le fait qu’il propose juste de les laisser d’abord de côté pour assimiler en premier les choses avec une couche d’abstraction plus simple. Selon lui, cela rend l’apprentissage plus souple.
Les choses simples par lesquelles il conseille de débuter l’apprentissage sont : fonctions et valeurs pures, correspondance de modèles, somme et types de produits et comment coller les entrées-sorties (I/O) pour créer des effets secondaires. D’après William Yao, avec cela, vous avez déjà tout ce dont vous avez besoin pour écrire des programmes utiles qui résolvent des problèmes du monde réel. Avec seulement ces quelques concepts, vous avez tout ce dont vous avez besoin pour construire tout ce que vous pouvez construire en Java, ou Python, ou Ruby.
Il a ajouté à cela certains autres concepts comme Aeson qui gère le format JSON pour la grande majorité du code Haskell, mysql-simple qui fournit un accès à la base de données, Hakyll qui est une bibliothèque Haskell pour générer des sites statiques, time qui est une bibliothèque pour gérer les dates, fournie avec le compilateur Glasgow/Glorious Haskell de GHC, etc. Selon William Yao, aucun de ces progiciels ne s'appuie sur des concepts avancés pour mettre en œuvre leurs fonctionnalités de base.
William Yao a ensuite expliqué qu’une autre chose importante à propos de Haskell est que vous pouvez passer progressivement à des outils et frameworks plus avancés, même dans le même projet. Il a aussi ajouté que la rigueur du compilateur vous sera d’une grande aide dans vos tests. D’après Yao, cela vous permet de décider, par exemple, de restreindre l'accès à la base de données à seulement certaines parties de votre base de code, permettant seulement à d'autres parties de faire des requêtes HTTP, et ainsi de suite, en utilisant des transformateurs plus simples et plus libres.
Son approche consiste à prendre du recul par rapport à la solution poids lourd et voir si l’on ne peut pas résoudre les problèmes en utilisant quelque chose de plus simple, ou quelque chose que l’on comprend déjà. Néanmoins, tout le monde n’est pas d’accord avec son avis sur la question. Certains pensent plutôt que c’est un mensonge de dire que le langage Haskell est facile à apprendre. Pour eux, il est facile de bien commencer comme le dit William Yao, mais les bases ne suffisent pas pour construire des choses robustes comme il le prétend.
« Le plus gros mensonge sur Haskell, c'est qu'il est facile à apprendre. Non, ça ne l'est pas, et je l'utilise au travail », a déclaré l’un d’entre eux. Selon ces derniers, il n'est pas si difficile d'obtenir une compréhension de base jusqu'à ce que vous tombiez sur certains éléments ou des fonctionnalités habituels (qui ne sont pas indispensable), notamment Functor, Applicative, Monad, pour que les choses se compliquent.
Source : William Yao
Et vous ?
Que pensez-vous des raisons avancées par William Yao ?
Avez-vous déjà programmé en Haskell ou essayé d'apprendre le langage ?
Pensez-vous qu'il est plus difficile que les autres langages que vous connaissez ?
Voir aussi
Apprendre Haskell vous fera le plus grand bien !
Quel langage de programmation comporte le plus de vulnérabilités en matière de sécurité ? Une étude de WhiteSource
Le langage de programmation V sera disponible en open source à partir de juin 2019 et serait rapide, léger et capable de traduire vos projets C/C++
Microsoft Research lance Bosque, un nouveau langage de programmation sans boucles et open source, inspiré par TypeScript