web-dev-qa-db-fra.com

Haskell ET LISP vs Haskell OR Lisp

Je code actuellement en C, C++ et Python. Je veux prendre un langage de programmation fonctionnel, et en ce moment je me tourne vers Haskell. Je ne veux PAS lancer ici une guerre "Haskell vs LISP"; ce que je veux savoir, c'est ceci: si j'apprends Haskell principalement pour une exposition à la programmation fonctionnelle, quels avantages, le cas échéant, vais-je gagner à apprendre plus tard Lisp?

41
Zeke

Je suggère d'apprendre les deux, Haskell d'abord, puis Common LISP. Mon expérience avec Haskell était que le typage statique semblait être une gêne restrictive au début, mais une fois que je m'y suis habitué, j'ai remarqué que la plupart de mes erreurs de type avaient des erreurs logiques se cachant derrière elles. Lorsque vous arriverez à ce point et à la prochaine étape, qui apprend à penser en types et à définir vos propres types comme moyen d'exprimer votre solution, vous serez prêt pour LISP commun.

Avec Common LISP, vous pouvez ajouter des monades, du curry et tout ce que vous avez aimé de Haskell, mais vous obtenez également plusieurs héritages comme Frank Shearar l'a mentionné, ainsi que des fonctions génériques avec plusieurs répartitions et un système avancé de gestion des exceptions.

Alors pourquoi ne pas simplement apprendre le LISP commun en premier? Venant d'un contexte procédural et OOP, mon expérience a été que je n'ai pas vraiment compris la programmation fonctionnelle jusqu'à ce que je devais l'utiliser exclusivement. Une fois que la programmation fonctionnelle est confortable, vous pouvez ajouter le reste de les outils que Common LISP met à disposition, et utiliser l'outil le mieux adapté à la tâche à accomplir.

58
Larry Coleman

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 ceci pour ne pas suggérer que OO et FP ne peut pas se marier, mais parce que ces deux langues sont des langues "gemmes" - une idée centrale prise pour extrêmes.)

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

LISP aura encore beaucoup à vous apprendre:

  • C'est multiparadigm, donc dsimcha le souligne il vous montrera comment intégrer FP avec d'autres paradigmes.
  • LISP vous apprendra que "code-is-data, data-is-code", par exemple à travers ses macros.
  • CLOS est une marque d'OO très intéressante, avec un héritage multiple qui fonctionne et des fonctions génériques.
31
Frank Shearar

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

Haskell est une sorte de "programmation fonctionnelle pure dans une tour d'ivoire"

LISP est une sorte de "code-est-données/données-est-code/créez vos propres constructions de langage". Vous pouvez manipuler votre code de la 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!

11
dagnelies

Apprendre LISP plus tard vous permettra de personnaliser Emacs, qui est sans doute l'éditeur de texte le plus avancé disponible. Vous ne pouvez pas faire ça à Haskell.

11
user1249

Le principal avantage que je vois de l'apprentissage du LISP est d'apprendre à intégrer FP dans une langue multiparadigm orientée vers le monde réel, plutôt que de l'apprendre uniquement dans le contexte d'une langue académique qui met l'accent sur la pureté.

7
dsimcha

Je viens également d'un arrière-plan C/C++/Python et j'ai essayé FP plusieurs fois au cours des dernières années. Au début, j'ai regardé Haskell et je ne pouvais pas en faire la tête ou la queue) , puis j'ai essayé Ocaml mais je n'ai pas beaucoup avancé. Enfin, j'ai commencé à entendre de bonnes choses à propos de Scala, je l'ai essayé et je l'ai trouvé très bien (j'avais aussi fait un peu de Java = dans le passé), au point qu'après un an de barbotage dans Scala (et en envoyant 161 problèmes avec Project Euler), Haskell semble avoir beaucoup plus de sens. En fait, je 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é que l'utilisation d'un langage multi-paradigme (c'est-à-dire Scala, mais LISP conviendrait probablement aussi) était un bon moyen pour la PF. Mais si vous êtes heureux de plonger dans Haskell (je ne l'étais pas), allez-y.

5
timday

Je venais à l'origine d'un arrière-plan C/C++/Ruby et j'utilisais FP concepts dans Ruby chaque fois que je le pouvais. État juste un peu blessé mon cerveau. Un de mes copains m'a appelé un jour, et il m'a demandé d'écrire quelque chose en Haskell (mon premier - et, espérons-le, pas le dernier - Haskell job!). J'ai rapidement appris la langue et j'ai assemblé quelque chose qui fonctionnait. Ce n'était pas beau ou quoi que ce soit, mais cela a fonctionné.

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

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

C++ ne peut pas tenir 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é d'Haskell ne fait jamais obstacle.

TL; TR Haskell est une bouffée d'air frais, et LISP est un Ruby légèrement plus fonctionnel.

2
Nate Symer