Haskell ET Lisp contre Haskell ou Lisp [fermé]

40

Je code actuellement avec C, C ++ et Python. Je veux choisir un langage de programmation fonctionnel, et pour l'instant je me penche vers Haskell. Je ne veux PAS commencer une guerre "Haskell vs Lisp" ici; Ce que je veux savoir, c'est ceci: si j'apprends Haskell principalement pour me familiariser avec la programmation fonctionnelle, quels avantages, le cas échéant, tirerai-je de l'apprentissage ultérieur de Lisp?

Zeke
la source
1
Et F # et Clojure.
cnd

Réponses:

58

Je suggère d'apprendre les deux, d'abord Haskell, puis Common Lisp. Mon expérience avec Haskell était que le typage statique semblait être un désagrément restrictif au début, mais une fois que je m'y suis habitué, j'ai remarqué que la plupart de mes erreurs de type étaient masquées par des erreurs de logique. Lorsque vous en arriverez à ce point et au prochain jalon, qui consiste à apprendre à penser à des types et à définir vos propres types comme moyen d’exprimer votre solution, vous serez prêt pour Common Lisp.

Avec Common Lisp, vous pouvez ajouter des monades, du currying et tout ce que vous aimez de Haskell, mais vous obtenez également un héritage multiple tel que mentionné par Frank Shearar, ainsi que des fonctions génériques avec envoi multiple et un système avancé de gestion des exceptions.

Alors pourquoi ne pas simplement apprendre Common Lisp en premier? Venant d’un arrière-plan procédural et de la programmation orientée objet, j’ai appris que je ne comprenais pas vraiment la programmation fonctionnelle avant de devoir l’utiliser exclusivement. Une fois que la programmation fonctionnelle est confortable, vous pouvez ajouter le reste des outils mis à disposition par Common Lisp et utiliser le meilleur outil pour la tâche à accomplir.

Larry Coleman
la source
6
Je pense que vous avez bien compris - ce qui rend Haskell et Smalltalk si utiles à l’apprentissage, c’est leur pureté.
Frank Shearar
4
Je suis d'accord avec la pureté qui rend l'apprentissage d'une langue beaucoup plus facile. Je ne pouvais pas comprendre le langage fonctionnel lui-même avec LISP car tout est possible dans le langage et j’ai trop d’arrière-plan impératif, OO. Mais en Haskell, il n’existe pas de tels concepts qui perturbent l’apprentissage.
Eonil
1
C'est drôle, j'ai eu l'expérience inverse. J'ai relevé les points principaux de la programmation fonctionnelle via Scheme, ma langue maternelle. Je pirate parfois à Haskell et je trouve inévitablement que je dois réapprendre à plus de 90% de ce que je savais chaque fois que je quitte Haskell pendant un certain temps. Ceci étant dit, Haskell est une langue incroyablement riche, avec beaucoup de choses à vous apprendre (avec beaucoup de force.) Types Types Types Types! Suivez les types!
Josh Infiesto
31

Et s'il vous plaît.

Haskell vous enseigne le plus pur de la PF, autant que je sache au moins, tout comme Smalltalk enseigne le plus pur de l'OO. (Je mentionne cela non pas pour suggérer que OO et FP ne peuvent pas se marier, mais parce que ces deux langues sont des langues "gemmes" - une idée fondamentale poussée à l'extrême.)

Lisp est vraiment une famille de langues, je vais donc parler de Common Lisp parce que c'est le membre de la famille que j'utilise.

Lisp aura encore beaucoup à vous apprendre:

  • C'est un multiparadigme, donc, comme le souligne dsimcha, cela vous montrera comment intégrer la PF à d'autres paradigmes.
  • Lisp vous apprendra que "code-est-données, donnée-est-code", par exemple via ses macros.
  • CLOS est une marque très intéressante d'OO, avec un héritage multiple qui fonctionne et des fonctions génériques.
Frank Shearar
la source
11

Apprendre plus tard Lisp vous permettra de personnaliser Emacs, l’éditeur de texte le plus avancé qui soit. Vous ne pouvez pas faire ça à Haskell.


la source
14
[Accentue ses parenthèses]
Inaimathi
6
Peut-être que quelqu'un peut écrire un éditeur de texte pour cela. J'entends le système d'exploitation Emacs ne vient pas avec un. (Je gosse. Je sais que vous pouvez avoir le mode Viper. :)
greyfade
14
En fait, il existe un clone Emacs appelé Yi, qui utilise Haskell exactement de la même manière qu'Emacs utilise Lisp. En fait, comparé à (GNU) Emacs, Yi est encore plus pur, car son noyau est également écrit en Haskell, alors que les noyaux Emacs ont généralement tendance à ne pas être écrits en Lisp. Le noyau de GNU Emacs est écrit en C, JEmacs en Java, par exemple.
Jörg W Mittag
2
@ Jörg, s'il s'agit d'une réimplémentation partielle au lieu d'un clone complet de GNU Emacs ou XEmacs, ce n'est pas la même chose. Semblable à comparer Word à Wordpad ou Notepad.
1
@ Thorbjørn Ravn Andersen: Oui, mais pas si mal. :)
Greyfade
11

Haskell et Lisp sont deux bêtes totalement différentes.

Haskell est un peu "une pure programmation fonctionnelle dans une tour d'ivoire"

Lisp is kindof "code-est-données / données-est-code / fabrique tes propres constructions de langage". Vous pouvez manipuler votre code de n'importe quelle manière que vous pouvez imaginer.

Ils sont très différents. Les deux partagent l’aspect "programmation fonctionnelle", mais c’est vraiment un tout petit point commun par rapport à leurs différences. Essayez-les et vous verrez à quel point ils sont différents!

les dagnelies
la source
+1: bon point. Je connais du Haskell et du Lisp. Même si je ne suis un expert dans aucun d'entre eux, je pense que vous avez raison de dire qu'ils sont très différents. En Haskell, vous n’avez pas l’idée d’utiliser des données comme code. Dans Lisp, vous n'avez pas de correspondance de motif (autant que je sache). La liste (!) Des différences est probablement plus longue.
Giorgio
7

Le principal avantage que je tire de l'apprentissage de Lisp est d'apprendre à intégrer la PF dans un langage multiparadigm orienté vers le monde réel, plutôt que de l'apprendre uniquement dans le contexte d'un langage académique mettant l'accent sur la pureté.

Dsimcha
la source
5
Je suppose que vous voulez une guerre "Haskell vs Lisp"!
Don Roby
3
Haskell est un langage académique qui met l'accent sur la pureté ... et beaucoup de gens l'utilisent dans le monde réel. Smalltalk est dans ce camp aussi.
Frank Shearar
Beaucoup de gens utilisent Haskell dans le monde réel?
Jon Harrop
1
@Jon Harrop: Eh bien, j'utilise Haskell dans le monde réel (et cela fonctionne très bien pour certaines applications), peut-être que je suis l'un des rares (?)
Giorgio
5

Je viens également d’un milieu C / C ++ / Python et j’ai essayé la PF plusieurs fois ces dernières années. Au début, j'ai regardé Haskell et je ne pouvais pas en tirer la tête ou la queue, puis j'ai essayé Ocaml mais je ne suis pas allé beaucoup plus loin avec ça. Finalement, j'ai commencé à entendre de bonnes choses à propos de Scala, je l’ai essayé et j’ai trouvé que cela me convenait très bien (j’avais aussi fait un peu de Java par le passé), au point qu’après une année de tant Le projet Euler pose problème), Haskell semble avoir beaucoup plus de sens. En fait, je viens de commander quelques livres sur Haskell et je veux essayer, bien que cela soit largement motivé par l'existence de Scalaz.

J'ai donc trouvé l'utilisation d'un langage multi-paradigme (c'est-à-dire Scala, mais Lisp conviendrait probablement aussi) d'une bonne façon de passer à la PF. Mais si vous êtes content de plonger dans Haskell (pas moi), foncez.

timday
la source
Intéressant que vous soyez allé plus loin avec Scala qu'OCaml. Comment venir?
Jon Harrop
@ Jon: Bonne question; dur à dire. Peut-être que je n'étais tout simplement pas prêt à «entrer» en service à l'époque. Peut-être que je viens de trouver un tutoriel Scala au bon niveau. Peut-être que la lignée C / C ++ / Java de Scala l'a rendue moins étrange. Compte tenu de tout pari rationnel de nos jours sur F # plutôt que sur Scala, je reviendrai probablement sur le domaine OCaml à un moment donné, bien que depuis que je m'amuse à cela, juste pour le pur plaisir de me lancer dans un "état d'esprit de programmation" différent de celui de C ++. dayjob, j’ai une inclination perverse pour réessayer Haskell à nouveau.
timday
Approche mobile en
douceur
2

Je suis originaire de C / C ++ / Ruby et j’utilisais les concepts de PF en Ruby chaque fois que je le pouvais. État juste un peu blessé mon cerveau. Un de mes amis m'a appelé un jour et il m'a demandé d'écrire quelque chose en haskell (mon premier travail - et j'espère pas le dernier - travail de haskell!). J'ai rapidement appris la langue et jeté ensemble quelque chose qui a fonctionné. Ce n'était pas beau ou quoi que ce soit, mais cela a fonctionné.

J'ai pris une pause d'un mois chez Haskell parce que je n'avais rien pour l'utiliser. Mais quand j'ai décidé d'écrire mon propre logiciel de blog, j'ai utilisé Haskell ( https://symer.io ). Haskell est vraiment cool parce que vous pouvez diviser un problème en plusieurs parties et les implémenter différemment en fonction des entrées. Haskell gère également très bien les défaillances grâce à une mise en boîte intelligente des valeurs. Il y a tellement d'outils pour travailler avec ces boîtes que vous oubliez tout simplement qu'elles existent.

Mon expérience avec lisp (Scheme) était complètement négative. Non seulement la langue manquait-elle de ces outils simples et intelligents, mais elle était aussi dangereusement lâche que Ruby ou JavaScript. Ce fut une expérience horrible et n'offre rien de nouveau au-delà de Ruby ou Python.

C ++ ne peut pas laisser une bougie à Haskell, en dehors de la gestion de la mémoire. Haskell est tout aussi rapide (sinon plus rapide), nettement plus concis et beaucoup plus sûr. Mais la sécurité de Haskell n'interfère jamais.

TL; TR Haskell est une bouffée d’air frais et Lisp, un rubis légèrement plus fonctionnel.

Nate Symer
la source