Journal Sortie du livre Real World Haskell

Posté par .
Tags : aucun
10
20
nov.
2008
Récemment j'ai décidé que ce serait certainement une bonne idée de me remettre à Haskell, un langage de programmation fonctionnel dont les caractéristiques (fortement typé, évaluation paresseuse, compréhension de listes...) le placent parmi les langages les plus agréables à utiliser quand on veut faire de la programmation de haut niveau.

Pour vous donner une idée de ce que permet de faire Haskell, la fonction quicksort s'écrit en deux lignes :

qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)


Bien sûr, ça n'est pas aussi rapide que du C, mais c'est plus rapide que beaucoup d'autres langages populaires comme Python et au coude-à-coude avec C# [1]

Voici une comparaison avec Python par exemple.

Plusieurs remarques : d'abord ce langage a beaucoup inspiré Python (y compris dans des aspects triviaux comme l'indentation !). Ensuite Haskell peut être interprété et compilé. Il est particulièrement utile pour la programmation en IA. Son principal inconvénient c'est qu'il est assez difficile à apprendre, des concepts comme les monades sont assez peu intuitifs et la documentation est quasi-inexistante.

Du moins jusqu'à maintenant...

Car je me suis aperçu en faisant quelques recherches sur le Net qu'un livre d'introduction (700 pages tout de même) vient de va bientôt sortir chez O'Reilly, et il est lisible en ligne gratuitement (avec possibilité de commenter chaque paragraphe) sur ce site. Les critiques sont assez élogieuses à propos du livre (qui sortira en anglais début décembre et en français...euh, jamais). Au fait est-ce que quelqu'un sait quel logiciel a été utilisé pour générer les pages Web de ce site ? C'est quand même vachement plus beau que du latex2html.

Sinon il y a quelques tutoriaux qui traînent sur le Net et qui répertoriés sur la page Haskell.org, mais ils sont en général destinés aux (bons) programmeurs C et ni très didactiques, ni exhaustifs.
  • # Site

    Posté par . Évalué à 7.

    Au fait est-ce que quelqu'un sait quel logiciel a été utilisé pour générer les pages Web de ce site ? C'est quand même vachement plus beau que du latex2html.

    Le livre est écrit en docbook, le site est écrit en django. Brian a promis de donner les sources du site quand il a le temps.
  • # Et par rapport à OCaml ?

    Posté par . Évalué à 2.

    Comment se situe Haskell par rapport à OCaml (qui m'a l'air d'être un langage avec des caractéristiques assez similaires) en termes de perfs ?
    • [^] # Re: Et par rapport à OCaml ?

      Posté par . Évalué à 3.

      Ocaml reste la plupart de temps devant, même si haskell à tendance à rattraper son retard (au niveau de la génération de code par exemple). D'un autre coté il y a plus de possibilités d'optimisation de haut niveau (supercompilation) en haskell, grâce a la séparation claire des effets des bords et du fonctionnel pur.
      • [^] # Re: Et par rapport à OCaml ?

        Posté par . Évalué à 4.

        Les différences majeures que je vois sont que Haskell utilise l'évaluation paresseuse par defaut.
        Un point que j'aime bien en Haskell, c'est les classes de types http://www.haskell.org/tutorial/classes.html
        Je préfère cette manière de fonctionner que celle d'ocaml.

        Sinon, de manière encore plus subjective, je trouve que Haskell est bien plus beau que ocaml,
        mais j'ai aussi beaucoup plus de mal a lire du code Haskell que du code Ocaml.
        D'autant plus que bien souvent, un programme Haskell manipule des concepts assez abstraits, ce qui aboutit à une solution souvent générale, mais pas forcément super abordable. Surtout que bien des développeurs semblent être adeptes des noms à une ou deux lettres...
  • # une interview de l'auteur du langage

    Posté par . Évalué à 5.

    datée de deux mois est rudement interessante et marque un peu certaines limites :

    http://www.computerworld.com.au/index.php?id=1974033854
  • # Un bon complément

    Posté par . Évalué à 3.

    Pour les personnes souhaitant débuter avec Haskell je vous recommande fortement ce site comme introduction au langage : http://learnyouahaskell.com/

    C'est très bien fait et plutôt plaisant à lire.
  • # contradictions

    Posté par (page perso) . Évalué à 2.

    >le placent parmi les langages les plus agréables à utiliser

    versus

    >Son principal inconvénient c'est qu'il est assez difficile à apprendre, des concepts comme les monades sont assez peu intuitifs et la documentation est quasi-inexistante.

    Tes propos ne sont pas en contradictions là ? ;-) Sauf peut-être pour les masochistes, effectivement :-)


    attention, je n'ai rien contre haskell, je n'ai pratiquement jamais utilisé, bien qu'essayé une fois en me cassant les dents dessus parce que justement, c'est totalement à l'opposé des langages classiques, peu intuitifs et difficile à apprendre, sachant qu'à l'époque, il y a 3-4 ans, il n'y avait quasiment pas de doc. Le fait qu'il y ait un livre est donc une bonne nouvelle :-)
    • [^] # Re: contradictions

      Posté par (page perso) . Évalué à 5.

      c'est pas incompatible, il peut être très agréable à utiliser une fois que tu l'as appris

      il y a très peu de langages faciles, mais la plupart sont faciles à utiliser car on a tous (ou presque) une connaissance de base orientée c/c++/java/c#/...
      et donc les langages proches nous sembles faciles.
      Mais c'est oublier qu'on a appris (parfois difficilement ;-) ) ces langages précédemment
    • [^] # Re: contradictions

      Posté par . Évalué à 2.

      Agréable à utiliser mais difficile à apprendre, oui.
      Je pense que l'accès à la documentation joue un grand rôle dans la difficulté d'un langage de programmation. Il y a quelques années quand j'en ai fait pour la première fois, la documentation d'haskell était aussi aguichante que le code pénal...
      Mais si on a les bons profs, c'est très agréable de programmer en Haskell, notamment à cause du typage fort qui permet de détecter beaucoup d'erreurs à la compilation, de l'interpréteur qui permet de tester rapidement des fonctions (en C, créer un fichier, le sauvegarder, le compiler, le lancer...) et du côté fonctionnel (évaluation paresseuse, lambda-fonctions, compréhension de listes, définition récursive des fonctions - c'est la définition qui est récursive et pas seulement la fonction).
      • [^] # Re: contradictions

        Posté par . Évalué à 2.

        Difficile à comprendre, ça ne fait aucun doute :) : je m'étais intéressé à Haskell après avoir apprécié Scheme et Caml, en lisant "A Gentle Introduction to Haskell", et si je comprenais bien le début, j'ai eu beau tenter de comprendre les monades, j'ai fini par avoir l'impression que c'est au dessus de mes capacités intellectuelles et j'ai abandonné là, désabusé.
  • # Et...

    Posté par . Évalué à 1.

    As-tu pensé à Scala?

    http://www.scala-lang.org/

    /* un petit coucou à toi Victor :} */
  • # Troll...

    Posté par . Évalué à 4.

    > c'est plus rapide que beaucoup d'autres langages populaires comme Python
    Mais oui, comparer les vitesses d'un langage compilé et d'un langage de script, quelle bonne idée ! (oui, je sais que Haskell peut être interprété, mais le benchmark shootout debian dont tu te sers de preuve utilise GHC, un compilateur Haskell)
    • [^] # Re: Troll...

      Posté par . Évalué à 1.

      Je ne suis pas très confiant envers Shootout mais c'est (à ma connaissance) le seul benchmark qui permette de comparer autant de langages avec autant de tests. Alors au vu de certains choix discutables que peuvent faire les webmestres de ce site et des différences de performance pas très flagrantes entre les premiers de la liste, j'ai pris Python. C'est un troll certes mais j'utilise Python pour presque tout ce que je fais alors je me suis permis...

      Cela dit mon but était juste de présenter un langage que je trouve intéressant mais qui peut en rebuter pas mal, la mauvaise qualité de la doc et l'impossibilité de programmer en impératif sans utiliser de monades y étant pour quelque chose. Alors Python c'est très bien pour les scripts mais quand on veut faire de la programmation haut niveau ou du prototypage, il y a plus rapide.
  • # Il était une fois les langages fonctionnels ...

    Posté par (page perso) . Évalué à 4.

    Je constate que depuis quelques années, les langages fonctionnelles refont surface :
    - les vieux langages reprennent du poil de la bête (Haskell, Erlang, ...)
    - les langages impératifs introduisent des concepts fonctionnels,
    - de nv langages fonctionnels apparaissent (Scala par exemple).

    Et je pense que ceci est en grande partie dû à deux aspects :
    - ce sont des langages d'assez haut niveaux qui permettent de répondre à des problématiques bcp plus complexes et de façon plus élégante que ne le peuvent actuellement les langages dîts impératifs,
    - les architectures multi-corps et la progression de la programmation parallèle sur le marché ont mis en lumière les limites des outils actuels utilisés et basé sur une structure impérative et les facultés des langages fonctionnels dans le domaine.
    Le tout évidemment combiné avec la monté en puissance des machines qui permettent de palier aux pb de perfs inhérents aux programmes fonctionnels (quoique lorsque l'on regarde un programme en Caml ...)

    Ce qui est intéressant dans Haskell, c'est l'innovation que gravite autour. Il supporte ainsi non seulement le fonctionnel de second ordre, mais aussi, en quelque part, le typage du second ordre avec ses classes de type (un clin d'œil à la théorie F-Bound de Cook).

    A côté de ceci, pour ceux qui veulent s'y exercer, il existe xmonad, un gestionnaire de fenêtres X en Haskell ; vous pouvez y lire un peu son code, jouer avec. Au début, je recommande de jouer d'abord avec la conf qui est écrite en Haskell et qui est compilée à la volé dès le démarrage ou le redémarrage du gestionnaire.

    Sinon, je me suis acheté le bouquin sur Erlang de Joe Armstrong (Programming Erlang: Software for a Concurrent World) afin de m'amuser un peu plus avec ce langage (enfin, qd j'ai le temps, ce qui est de plus en plus rare ces temps-ci)
    • [^] # Re: Il était une fois les langages fonctionnels ...

      Posté par . Évalué à 2.

      J'ai également lu le bouquin de Joe Armstrong et j'ai réalisé un petite application pour m'amuser et découvrir ce langage sous la forme d'un petit web-chat.
      Le résultat se trouve ici (serveur de préprod, donc on peut y faire ce que l'on veut) : http://www.euphorik.ch:8090
      Et le code est libre et disponible ici : http://dev.euphorik.ch/repositories/browse/euk/tags/1.1.4

      Ce qui est marrant c'est que le paradigme fonctionnel existe depuis bientôt 50 ans avec des langage tel que Lisp. Il a beaucoup et est toujours utilisé dans le domaine de la recherche mais peu connu par le grand public. A mon avis c'est dû au grand succès de C puis de l'orienté objet façon C++ qui ont donné naissance à des langages, pas forcément des plus joyeux, comme Java et C# qui représentent actuellement une très grande partie du marché.

      On redécouvre actuellement le fonctionnel grâce à des langages de plus en plus accessibles et documentés tels que Clojure, Erlang, Scala, OCaml, Haskell, etc. Il est clair que la programmation fonctionnelle apporte des concepts plus abstraits comme la currification, les fonctions de premier ordre, les fonctions d'ordre supérieur, l'immutabilité, etc. alors que l'orienté objet se veut une approche de modélisation du monde réel par décomposition en objets.

      Également quelques langages, à la base très orienté objet, se rapprochent du monde fonctionnel, je pense notamment à Ruby, Python et C# (peut être Java dans quelques dizaines d'années :P).

      Bref, j'encourage tout le monde, du moins les programmeurs, à s'intéresser de plus près à ces langages. J'avais mis un lien précédemment qui je pense peut être une bonne introduction, je le remets ici : http://learnyouahaskell.com/chapters
      Bonne lecture !
      • [^] # Re: Il était une fois les langages fonctionnels ...

        Posté par . Évalué à 3.

        Hm Lisp c'est surtout un "précurseur" (même s'il n'a pas été égalé sur tous ses points forts et dépassé sur d'autres) des langages symboliques, et même s'il est plus fonctionnel que du C ça n'est pas non plus un langage fonctionnel pur, et on peut même dire que l'exécution est carrément impérative à un niveau pas si bas que ça. Je dirais que les features fonctionnelles de base sont devenues quasi-indispensable (au bout de temps de décennies, il serait temps) dans les langages modernes répandus mais la nature profondément impérative de la plupart des langages mainstream les rend assez profondément incompatible avec l'évaluation paresseuse généralisée qu'on trouve Haskell. Et c'est là que le fonctionnel peut vraiment dévoiler sa puissance ; dans le cas contraire on se contente plus ou moins de faire un espèce de SSA à la main, et peut-être que ça à des effets positif sur la qualité (ou peut-être pas) mais ça n'augmente pas la "puissance" du langage plus que ça... (bon ça permet quand même des "astuces" de syntaxe qui augmentent la concision, ce qui reste appréciable, mais j'ai quand même la sensation profonde qu'on reste un niveau notable en dessous de ce que permet l'évaluation paresseuse)
    • [^] # Re: Il était une fois les langages fonctionnels ...

      Posté par . Évalué à 4.

      À mon avis, il y a aussi un aspect qui se rapproche de la notion de masse critique, une question de présence dans la culture de fond (à côté du radiateur).

      Il a p.ex. fallu pas mal de temps pour que l’orienté objet soit réellement utilisé : des concepts en 1965-1980 à nos jours où quasiment aucun langage ne les possède pas.

      J’ai une idée sur l’évolution de cette culture de fond (et je parle bien de l’évolution de la culture commune de la masse, pas de l’évolution des langages eux-mêmes, hein).
      Au début était le verbe ; mais seulement à l’impératif. L’impératif semble le plus facile à concevoir (façon recette de cuisine, liste de tâches à faire). Ensuite, on ajoute l’objet ; il s’intègre bien dans un langage impératif. Ça ne demande que quelques concepts en plus (encapsulation, classe, héritage…), et pas forcément tous en même temps. Il y a mis le temps mais l’objet est devenu une connaissance de base. Et, depuis 14 ans, les motifs de conception ont fait leur apparition. Et si on regarde bien, qu’ajoutent-ils ? Des concepts fonctionnels à la POO. La plupart des motifs du GoF95 expliquent comment faire en OO ce que l’on ferait si simplement en fonctionnel, comme passer des comportements (donc des fonctions) par des objets (Command, Iterator, Visitor…).

      De ce fait, des notions de programmation fonctionnelle entrent dans le pot commun et, donc, les langages fonctionnels commencent à reprendre la cote. Ils ne sont plus si étranges puisque l’on en connaît quelques notions, par leur utilisation.
      • [^] # Re: Il était une fois les langages fonctionnels ...

        Posté par (page perso) . Évalué à 2.

        Au debut, le verbe etait fonctionnel. La prog fonctionelle (le lambda calcul), c'est les annees 30, bien avant les ordinateurs usuels...
        Non seulement les concepts etaient la, mais ils etaient prouve's mathematiquement...

        La prog fonc, c'est la fete a la maison. Du code de haut niveau, une super modularite', et des principes supers evidents, contrairement a ce qu'on lit/entend souvent... La recursivite' *est* naturelle pour l'homme. Un exemple (lu hier) simple, celui de l'historien :
        1/ Un historien lit un livre, puis liste les references citees et ecrit ses notes
        2/ Pour chaque reference, il lit le livre et continue ainsi de suite.
        *hooo* la recursivite, c'est juste ca ?
        Ben oui. Vachement dur hein ? C'est super naturel, mais pas imperatif du tout.
        Apres, l'abstraction fonctionelle elle meme, c'est les outils de tout les jours, y compris l'homme lui meme.
        Tu prends un gars G, tu lui donnes un petit marteau M, et tu obtiens MG qui attend juste un petit clou pour l'enfoncer. Application partielle et typage d'un coup. Franchement, c'est ultra simple a concevoir le fonctionnel... et tellement naturel...

        Enfin, j'ai bosse' dans deux boites, j'ai fait du Scheme, du Erlang et du Common Lisp... Je ne travaille que dans des boites qui utilisent des langages fonctionnels, et c'est toujours des boites qui veulent du bon code robuste, propre, efficace, et facile a maintenir, et des devs doue's. Ets elles l'ont.

        La cote des langages fonctionelle sera limitee tant que la qualite des logiciels ne sera pas un facteur determinant, et tant qu'on aura des chefs de projet sans qualifications adequates. Autant dire longtemps... (le pro des prog fonc qui me dit "on va faire ca en PHP", je lui fait confiance. Le gars qui n'y connais rien en prog fonc et qui me dit "on va faire ca en PHP", je lui rigole au nez et je me casse)
        • [^] # Re: Il était une fois les langages fonctionnels ...

          Posté par . Évalué à 1.

          Ah ouais évident la récursivité .... ça te dit de passer dans les amphis de France pour le dire à tous ces étudiants pour qui c'est compliqué, inutile, à la limite de la magie ???

          Alors je suis d'accord, une fois que t'es à l'aise avec la récursivité tu peux la voir partout ... mais c'est un peu réducteur de dire que la récursivité est évidente pour tous. Ton historien, s'il l'utilise sans en être conscient, ne va pas nécessairement la trouver évidente ta récursivité ...
        • [^] # Re: Il était une fois les langages fonctionnels ...

          Posté par . Évalué à 4.

          Au debut, le verbe etait fonctionnel. La prog fonctionelle (le lambda calcul), c'est les annees 30, bien avant les ordinateurs usuels...
          Non seulement les concepts etaient la, mais ils etaient prouve's mathematiquement...


          J’avais pourtant bien écrit :
          (et je parle bien de l’évolution de la culture commune de la masse, pas de l’évolution des langages eux-mêmes, hein)
          parce que ce dont on parle, c’est bien de la popularité des concepts parmi ceux qui programment.

          […] Ben oui. Vachement dur hein ? C'est super naturel, mais pas imperatif du tout.

          Ben si, ta présentation de la récursivité, elle est impérative-procédurale pour moi, avec des effets de bord en plus.
          Et le passage de la récursivité itérative/impérative à la programmation fonctionnelle, il n’est pas si facile que cela.

          La cote des langages fonctionelle sera limitee tant que la qualite des logiciels ne sera pas un facteur determinant, et tant qu'on aura des chefs de projet sans qualifications adequates. Autant dire longtemps...

          C’est pas faux.

          (le pro des prog fonc qui me dit "on va faire ca en PHP", je lui fait confiance. Le gars qui n'y connais rien en prog fonc et qui me dit "on va faire ca en PHP", je lui rigole au nez et je me casse)

          Oh, ben moi, dès qu’il dit « PHP », qu’il soit pro de la programmation fonctionnelle ou pas, je me casse… :oP

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.