Pourquoi apprendre Haskell

… aperçu d'un langage intriguant

a marqué ce sujet comme résolu.

Rust est censé être sûr. Pourtant il y a seulement des éléments piqués au fonctionnel, c'est pas un langage fonctionnel.

Arrête de croire que pour faire du fonctionnel il faut faire du Haskell. Les outils fonctionnels dans des langages multiparadigmes sont super utiles, par exemple mon TIPE en Python est truffé d'emprunts au fonctionnel (et avant que quelqu'un le fasse remarquer, si j'avais pu le faire en Haskell je l'aurais fait). Déjà, si tu montres à quel point certains éléments du fonctionnel sont puissants les gens auront peut-être envie d'en savoir plus, ce qui sera moins le cas si tu leur dis juste "mais nonnn faut faire du haskell si tu veux utiliser map".

J’approuve ce message. J’aime beaucoup Haskell, c’est lui qui m’a fait découvrir la programmation fonctionnelle, et ce fut tout de suite le grand amour… mais ça fait un moment que je ne programme plus en Haskell et que je suis passé à Rust.

Parce qu’à part dans quelques cas très précis, l’évaluation paresseuse, ça me gonfle. Parce que pouvoir déboguer en balançant des println!() partout, c’est tellement plus simple… Parce que le système de FFI de Rust est considérablement plus simple que celui de Haskell.

Bon, ça me saoule de ne pas avoir de vraies monades, et je préfère globalement la syntaxe de Haskell, mais dans l’ensemble, je pense y avoir gagné à mettre de l’eau dans mon vin fonctionnel. :)

+1 -0

Rust est censé être sûr. Pourtant il y a seulement des éléments piqués au fonctionnel, c'est pas un langage fonctionnel.

Rust est safe juste que les variables marquées mut peuvent être mutées (c'est le principe mais tu peux plus facilement avoir un truc indésirable dans tes variables du coup).

D'ailleurs faut que je me mette à Rust.

Déjà, si tu montres à quel point certains éléments du fonctionnel sont puissants les gens auront peut-être envie d'en savoir plus, ce qui sera moins le cas si tu leur dis juste "mais nonnn faut faire du haskell si tu veux utiliser map".

Pas faux.

En fait je pense que c'est impossible de traiter pourquoi j'aime Haskell, parce que ça suppose déjà que le lecteur connaît Haskell comme Dominus l'a dit toutà l'heure. Je pense que je vais devoir zapper toute la partie sur les caractéristiques, ou en tout cas l'écourter pour laisser place à des notions plus facilement compréhensibles des devs non-fonctionnels.

Parce que pouvoir déboguer en balançant des println!() partout, c’est tellement plus simple…

Sinon y'a le module Debug.Trace, c'est pas fameux mais ça reste potable.

Parce que le système de FFI de Rust est considérablement plus simple que celui de Haskell.

Jamais essayé, j'avais pourtant entendu du bien de la FFI de Haskell :euh:

Salut,

Pourquoi ne pas plutôt faire un article de présentation du Haskell (un peu dans le même genre que celui-là sur Julia). Pour moi, un article ne devrait pas me dire pourquoi je devrais apprendre un langage, mais le présenter assez pour qu’à la fin j’ai envie d’approfondir les choses.

+3 -0

En fait je me suis basé sur cet article pour le plan à l'origine. Je voulais pas trop faire un présentation pure non plus, mais vos critiques m'ont fait comprendre que c'était difficile et pas forcément pertinent. Du coup ouais je vais plutôt faire ça, merci :)

Par contre je pars demain et je reviens le 11, je sais pas si je vais beaucoup avoir le temps de bosser dessus. En tout cas je vais y réfléchir.

En fait tu as deux choix :

  • Soit tu veux partager ton avis personnel et dans ce cas là une tribune libre, dispo sur zds bientôt, pourrait tout a fait convenir et entraînerai surement un débat intéressant à la suite. Ce format est justement fait pour autoriser les contenu biaisés.
  • Soit tu veux présenter Haskell (ou le paradigme fonctionnel) et dans ce cas là il faut un ton plus neutre.

Quelques idées de choses qui peuvent entrer dans une présentation de haskell qui ne sont pas ou peu connu dans les autres langages impératifs/objets :

  • pattern matching,
  • type algébrique,
  • Monad (par exemple les simple tel que Maybe qui en soit est intéréssant).

  • quelques exemple ou ce genre de langage excelles (parsing par exemple).

Je pense que par contre tu ne coupera pas à dire que a contrario quand on sort du monde "pur" ça peut devenir chiant.

J'approuve le commentaire de Dominus Carnufex (du moins, ce que j'en ai lu en diagonale), mais je vais encore une fois jouer le rôle du mauvais flic commentateur désagréable, parce qu'il en faut bien un : il reste encore beaucoup d'inexactitudes, voire d'erreurs dans ton article. Je ne le dis pas pour t'enfoncer, mais pour que tant qu'à écrire sur haskell (super idée, il en faut plus des comme toi !), tu en profites pour te perfectionner.

Une petite liste :

Une fonction dans un langage fonctionnel est une fonction au sens mathématique.

Non, c'est plus que ça. Sans pinailler sur la différence entre fonction et application, en mathématiques, on ne s'intéresse qu'aux images de chaque antécédent par une fonction. En programmation, la façon dont on les calcule est très importante : les fonctions mathématiques $x \mapsto x$ et $x \mapsto cos (arccos (\sqrt x^2))$ sont exactement les mêmes (sur le bon domaine), mais leurs traductions mot-à-mot en haskell ne sont pas du tout équivalentes.

Mon avis personnel est qu'on constate que les programmeurs haskell ont très facilement tendance à faire le raccourci "= en haskell c'est exactement comme le $=$ des maths" (à cause sans doute de l'insistance sur la pureté et sur une certaine mathématisation de la programmation, et probablement aussi d'un effet pervers de la paresse), et que c'est une des raisons pour lesquelles je n'aime pas orienter les gens qui veulent découvrir le fonctionnel vers haskell (surtout s'ils viennent d'un monde mathématique).

(…)

Le paradoxe sur la pureté est un peu fumeux et approximatif, mais il n'y a pas vraiment de bêtise apparente. Je passe.

(…)

L'évaluation paresseuse est une stratégie d'évaluation qui consiste à n'évaluer qu'en cas de besoin. Par exemple, dans le cas suivant: (…) calculSuperLourd 1 2 3 ne sera pas évalué, donc cela améliore les performances.

Ta formulation laisse croire que l'évaluation paresseuse par défaut permet d'obtenir des meilleures performances. En pratique, c'est l'inverse : dans certains cas précis (comme l'exemple que tu donnes, qui est artificiellement construit pour), ça permet d'éviter de faire des calculs (voire de terminer au lieu de boucler indéfiniment), mais dans le cas général, la machinerie supplémentaire nécessaire dégrade les performances. D'ailleurs, je ne fréquente pas énormément la communauté haskell, mais la plupart des gens avec lesquels j'ai discuté trouvent que la paresse par défaut est un mauvais choix (ce qui ne rend pas le langage mauvais - et d'ailleurs, c'était une bonne idée d'essayer). D'ailleurs, Idris, qui vient pourtant manifestement de la même communauté, a décidé d'être strict par défaut (ce qui n'empêche pas d'être explicitement paresseux quand c'est nécessaire, comme haskell permet d'être explicitement strict).

Haskell est probablement le langage le plus sûr utilisé en industrie. La notion d'erreur à l'exécution n'existe pas en Haskell (du moins si on évite une poignée de fonctions).

Un des langages les plus sûrs, sans aucun doute, mais "le langage le plus sûr utilisé en industrie", c'est un peu rapide. Par exemple, j'ai entendu dire qu'airbus utilisait CompCert, un compilateur écrit en Coq. Dans le domaine de la sûreté, haskell est à la ramasse :-P

Quant aux erreurs à l'exécution, c'est faux :

1
2
λ head []
*Exception: Prelude.head: empty list

Haskell (comme tous les langages typés statiquement) permet d'éviter les erreurs de type à l'exécution (on est sûr qu'un programme qui compile n'essayera pas d'additionner un entier et une chaîne de caractères). Il existe quand même un paquet d'autres erreurs à l'exécution, et le système de types de haskell n'est pas assez puissant pour toutes les éviter. C'est un compromis nécessaire si on ne veut pas à avoir à écrire des preuves qui font environ la taille du programme pour convaincre le typeur qu'il est correct. C'est ce qu'on fait par exemple en Coq, et ça allonge nettement le temps de développement : il faut choisir le bon compromis pour les tâches qu'on doit résoudre.

Haskell a la philosophie suivante: si le programme compile, alors il est mathématiquement impossible que celui-ci crash.

La même chose que plus haut, mais j'insiste : le système de types de haskell est loin d'être assez puissant pour permettre ce genre de choses. Attention à ne pas trop survendre qand même :-P

(…)

Pour le paragraphe sur le typage, c'est un peu comme sur la sûreté : c'est globalement inexact mais il n'y a pas d'erreur flagrante corrigeable rapidement.

(…)

Pour un langage d'un tel niveau d'abstraction, Haskell a plutôt de bonnes performances. Il est à peu près au niveau de la JVM niveau rapidité mais utilise quatre fois moins de mémoire.

On pourra me répondre que tout est dans le "à peu près", certes, mais avec ce genre d'à peu près, tous les langages sont à peu près aussi rapides que le C :-°

Surtout que :

Il est tout à fait envisageable de faire un petit jeu 3D en Haskell.

Pouvoir éventuellement faire "un petit jeu 3D", c'est pas si flatteur pour les performances, et cette phrase laisse croire que tu ranges haskell dans la catégorie des langage rigolos, avec lesquels on peut faire des jolies choses, mais qu'on laisse au placard une fois qu'on a fini de jouer avec pour retourner aux langages qui permettent d'écrire des vrais programmes. Crois-moi sur parole : tes lecteurs, qui viendront tous du monde C++/Java/"langage de la vraie vie et pas de chercheur", se jetteront sur la première occasion pour conforter leur idée que les langages fonctionnels ne sont pas adaptés au "monde réel", même si tout le reste de ton article insiste sur le contraire. Ne leur donne pas ce plaisir !

(…)

Sur la partie "domaines de prédilection", j'ai une approche complémentaire de celle de dominus carnufex : lui trouve qu'ils ne sont pas assez excitants pour le lecteur lambda (ce que je lui concède bien volontiers), mais moi qui suis un peu plus excité par ce genre de choses, je trouve un peu dommage de balancer comme ça "haskell c'est cool pour écrire un compilateur/la concurrence" sans expliquer un peu pourquoi (respectivement et pour faire bref, parce que les types algébriques et l'expressivité du langage permettent de manipuler facilement le genre de données structurées qu'on rencontre dans le traitement d'un programmes, et parce que l'idéal du "sans effet de bord" rend de facto obsolète le besoin de verrous et tous les problèmes qui vont avec).

Apprendre Haskell vous permettra d'ouvrir votre esprit et d'élargir vos connaissances

Oui ! Comme quoi, je ne fais pas que critiquer : ce paragraphe est très bien. Si tu veux pousser les gens à apprendre haskell, c'est finalement la seule raison valable : tu ne convaincras pas grand monde d'apprendre haskell dans le but de l'utiliser réellement, mais les gens intelligents doivent pouvoir comprendre qu'apprendre un langage qui propose une vision différente de la programmation les rendra meilleurs même s'ils reviennent à d'autres langages plus répandus (et comme il y en a quelques uns qui se perdent en route, c'est comme ça que la communauté s'agrandit ^^ ).

Par contre, je suis beaucoup moins d'accord avec la partie "pourquoi ne pas apprendre haskell". D'abord, la partie sur les salaires est probablement fausse (mais elle n'est pas vraiment pertinente, parce que c'est surtout une question de domaine dans lequel on travaille), et ensuite, la partie sur "si vous aimez pas les maths, vous aimerez pas haskell" ne fait que contribuer à répandre des préjugés qui ont déjà la vie assez dure comme ça. Ce n'est pas parce qu'on n'a aucune chance de s'intéresser par les modèles catégoriques du lambda calcul qu'on est incapable d'apprécier la sûreté du typage statique !


Il ne faut pas mal prendre ce message : globalement, je trouve qu'on parle bien trop peu de haskell sur zds, et beaucoup trop des langages mainstream dont on entend déjà parler partout. C'est une très bonne chose d'avoir ce genre d'article, mais écrire sur haskell n'est pas suffisant, il faut écrire bien, et j'espère que ces remarques t'aideront à améliorer tes connaissances du langage et les écrits qui viendront avec.

+5 -0

Salut,

J'étais en vacances sans ordinateur, donc je viens juste de lire vos messages.

Ça mijote encore un peu dans ma tête pour essayer de trouver un plan qui prenne en compte toutes vos remarques.

Sinon:

Il ne faut pas mal prendre ce message

Pas du tout, encore une fois, je préfère m'en prendre plein la gueule dans le sujet de la bêta plutôt que d'en prendre plein la gueule à la version finale :lol:

Ce sujet est verrouillé.