web-dev-qa-db-fra.com

Scheme vs Haskell pour une introduction à la programmation fonctionnelle?

Je suis à l'aise avec la programmation en C et C #, et j'explorerai C++ à l'avenir. Je pourrais être intéressé à explorer la programmation fonctionnelle comme un paradigme de programmation différent. Je fais cela pour le plaisir, mon travail n'implique pas de programmation informatique et je suis quelque peu inspiré par l'utilisation de la programmation fonctionnelle, enseignée assez tôt, dans les cours d'informatique au collège. Le calcul lambda dépasse certainement mes capacités mathématiques, mais je pense que je peux gérer la programmation fonctionnelle.

Lequel de Haskell ou Scheme servirait de bonne introduction à la programmation fonctionnelle? J'utilise emacs comme éditeur de texte et j'aimerais pouvoir le configurer plus facilement à l'avenir, ce qui impliquerait l'apprentissage d'Emacs LISP. Ma compréhension, cependant, est que Emacs LISP est assez différent de Scheme et est également plus procédural que fonctionnel.

J'utiliserais probablement le livre "The Little Schemer", que j'ai déjà acheté, si je poursuis Scheme (cela me semble un peu bizarre de ma lecture limitée). Ou utiliserais le "Learn You a Haskell for Great Good" si je poursuis Haskell. Je regarderais également les vidéos d'introduction à Haskell du Dr Erik Meijer sur Channel 9.

Toutes suggestions, commentaires ou contributions appréciés.

Merci.

P.S. BTW J'ai également accès à F # depuis que j'ai Visual Studio 2010 que j'utilise pour le développement C #, mais je ne pense pas que cela devrait être mes principaux critères de sélection d'une langue.

36
haziz

Je recommanderais OCaml.

À mon point de vue personnel, la base principale des programmations fonctionnelles modernes¹ sont les fonctions d'ordre supérieur, un système de type statique, les types de données algébriques et la correspondance de modèles.

Entre un schéma, un ML et un Haskell, je choisirais le ML parce que je pense que c'est le plus pertinent pour cette définition. Le schéma n'a pas de frappe statique (il y a Typed Racket, mais ce n'est pas pour les débutants), et Haskell a trop d'autres choses (monades, évaluation paresseuse ...) qui, bien qu'intéressantes, peuvent détourner l'attention de la base importante .

SML et OCaml sont également intéressants; Je suis plus habitué à OCaml, et il a un sentiment plus "pratique" qui est sympa (mais si vous voulez vraiment "pratique" au risque de perdre votre âme, vous pouvez aussi bien choisir F #).

Scheme et Haskell sont également des langues très intéressantes. L'accent mis par le programme sur les macros est intéressant, mais pas directement lié à la programmation fonctionnelle (c'est une autre des choses au monde que vous devriez certainement essayer, ainsi que la programmation logique, les langages basés sur la pile et le E axé sur les capacités).

Haskell est définitivement un excellent langage et, je pense, un point obligatoire pour les aspirants gourous de la programmation fonctionnelle. Mais comme les langages de base d'OCaml et de Haskell sont très similaires (à l'exception de l'évaluation paresseuse qui distrait pour le débutant), il est facile d'apprendre Haskell une fois que vous connaissez les bases d'OCaml. Ou plutôt, vous pouvez vous concentrer sur les trucs bizarres et vous n'avez pas à assimiler les bases en même temps.

De même, une fois que vous avez vu OCaml, et peut-être aussi Haskell, et que vous voulez toujours en savoir plus, vous devriez regarder Coq ou Agda. Pourtant, peu recommanderaient Coq ou Agda pour une première introduction à la programmation fonctionnelle ...

Pour clarifier mon point de vue: je pense qu'apprendre OCaml (ou SML) puis Haskell fera de vous un aussi bon programmeur fonctionnel que d'apprendre Haskell directement, mais plus facilement (ou moins douloureusement).
En outre, OCaml et Haskell ont tous deux de bonnes choses qui les différencient, et il est intéressant de connaître les fonctionnalités avancées de les deux . Apprendre juste Haskell est plus pauvre à cet égard (bien que vous puissiez bien sûr apprendre OCaml après Haskell; je pense que c'est moins logique et cela vous rendra plus frustré).

Pour apprendre OCaml, je recommanderais Brouillon du livre de Jason Hickey (PDF) .

¹cette définition est controversée. Certains utilisateurs de Scheme affirmeront que la saisie statique n'a rien à voir avec la programmation fonctionnelle. Certains Haskell affirmeront que leur définition de la pureté ("ce que fait Haskell, mais pas plus") est une condition sine qua non pour être un langage fonctionnel . J'accepte d'être en désaccord.

28
gasche

Si vous êtes intéressé par les concepts les plus avancés de la programmation fonctionnelle, optez pour Haskell. Il existe un système de type approprié et une interdiction stricte de la mutation. Pourtant, Haskell n'est pas pour les cœurs sensibles.

Si vous voulez juste une introduction à la conception fonctionnelle, allez avec Scheme. La syntaxe est beaucoup plus facile à apprendre et à lire. Il autorise la programmation procédurale, mais juste vous discipliner pour ne pas utiliser de procédure avec un ! à la fin du nom.

Avec Scheme, vous pouvez également lire Structure et interprétation des programmes informatiques , qui est la meilleure introduction aux paradigmes de programmation. Il y a des conférences sur le livre à la fois MIT et Berkeley .

26
Hoa Long Tam

La bonne réponse est, bien sûr, les deux! Il s'agit donc simplement de savoir quelle langue aborder en premier. Ma situation est identique à la vôtre. J'ai vraiment beaucoup apprécié The Little Schemer. Vous comprendrez certainement les constructions de base de la programmation fonctionnelle après avoir traversé cela (et aurez un endroit pour mettre vos taches de gelée!)

Je suis environ un quart dans Learn You a Haskell for Great good. J'apprécie un peu cela aussi, mais les deux livres ne pourraient pas être plus différents. Learn You a Haskell a une approche très traditionnelle de l'enseignement d'une langue spécifique. Le Little Schemer est spécifique au Scheme, évidemment, mais est beaucoup plus concerné par l'enseignement des principes fondamentaux de la programmation fonctionnelle, pas du langage du Scheme.

Je recommande vraiment de commencer par The Little Schemer. C'est moins pratique, mais plus fondamental.

17
DaveGauer

Mes deux cents en ce qui concerne la programmation fonctionnelle est de ne pas se raccrocher à un langage particulier, mais d'apprendre les concepts clés de la programmation fonctionnelle. J'ai appris la programmation fonctionnelle en étant projeté tête première dans un projet dans lequel mon patron insistait pour que tout le développement se fasse dans APL. APL est un langage de traitement de tableau fonctionnel et est aussi loin de LISP, Haskell ou de tout autre langage de programmation grand public que vous pouvez obtenir. Le vrai gain a été quand j'ai découvert qu'une fois que j'avais "bouleversé" le paradigme de programmation fonctionnelle et appris mentalement à décomposer automatiquement un problème en un programme fonctionnel, je n'étais vraiment plus intimidé par les aspects idiomatiques d'autres langages fonctionnels comme Haskell, OCaml, Scheme, Scala et Clojure. Depuis, j'ai réussi à me familiariser avec d'autres langages fonctionnels et j'ai écrit un code de qualité commerciale assez bon en OCaml, Scala et SBCL.

Si je devais choisir un premier langage fonctionnel, je choisirais probablement Haskell ou Steel Bank Common LISP (SBCL). Pour Haskell, je lirais Learn You a Haskell ..., Real World Haskell, The Haskell Road to Logic, Maths and Programming, et Perles de conception d'algorithmes fonctionnels. Pour CL, je lirais Land of LISP, Paradigms of Artificial Intelligence Programming, et (si vous êtes vraiment hardcore) Let over Lambda . Vous pouvez mélanger et assortir tous ces livres pour obtenir un large aperçu des approches et des concepts de programmation fonctionnelle fonctionnelle.

J'envisagerais également d'apprendre Clojure et Scala, car ce sont à la fois de très bons langages fonctionnels et très expressifs (malgré ce que FP puriste pourrait dire).

17
Marc

Je suis d'accord avec le point "apprendre les deux", mais il y a quelques autres points qui n'ont pas été mentionnés jusqu'à présent. Tout d'abord, si vous êtes nouveau dans la programmation fonctionnelle et que vous optez pour Haskell, vous devez faire face à plusieurs nouvelles choses en plus de FP: vous devez apprendre à vivre dans un environnement paresseux qui peut prendre un effort considérable, et vous avez besoin pour faire face à un système de type "réel" qui peut être très loin de ce que vous utilisez en C ou C #.

Le schéma, OTOH, a une syntaxe d'aspect étranger, mais il n'y a pas de système de type statique à apprendre, et c'est un langage strict, donc les choses sont plus familières. De plus, les implémentations de Scheme ont tendance à être très malléables - par exemple, Racket prend cela à l'extrême et fournit une variante paresseuse et une variante typée statiquement. Cela signifie que vous pouvez commencer avec les choses "faciles" et vous familiariser avec l'utilisation d'un langage fonctionnel, et plus tard, vous pouvez vous développer et utiliser la variante typée et la variante paresseuse. Ils devraient être plus faciles maintenant, car vous pouvez traiter une seule fonctionnalité à la fois. Pour être clair, les concepts vont être suffisamment nouveaux pour que le problème syntaxique soit mineur et peu pertinent. En d'autres termes, une fois que vous aurez commencé à découvrir les nouveaux concepts, vous serez suffisamment occupé pour que la syntaxe disparaisse. (Et si vous vous souciez vraiment de la syntaxe, la syntaxe de Haskell est quelque chose que je considère personnellement très élégant - mais c'est parce qu'elle est également très loin de votre syntaxe C/C #/C++ moyenne.)

Mais après avoir dit tout cela, je pense qu'il y a aussi un bon point pour F # - vous dites que vous faites cela comme une chose secondaire, mais quand vous apprenez FP vous voudrez bientôt utiliser toutes ces bonnes choses. L'utilisation de F # signifie que vous pouvez faire plus de "vraies" choses, car il est probablement facile de s'attaquer au même type de problèmes que vous traitez dans votre travail de jour. Idéalement, vous arriverez à un point où vous " Je vois l'avantage de l'utiliser sur, disons, C # - et de l'utiliser dans certains projets. Donc, même si vous avez raison de ne pas choisir F # uniquement parce qu'il est plus facile pour vous d'accéder, vous devriez le considérer car il n'y a rien de mieux qu'en réalité en utilisant ces nouveaux concepts. En revanche, si vous utilisez Scheme ou Haskell et le considérez comme un langage de jouet pour votre usage (même si vous savez que certaines personnes utilisent pour des applications réelles), alors vous ne prendrez jamais la chose FP chose trop au sérieux. [Mais YMMV, il est principalement basé sur des observations subjectives et peut varier considérablement d'une personne à l'autre.]

6
Eli Barzilay

Écrivez-vous un schéma en 48 heures (en haskell)

Je le recommande vraiment. Vous apprendrez Haskell en utilisant un problème réel et intéressant, et vous apprendrez la meilleure leçon de schéma en jouant avec l'interpréteur que vous construisez. Si vous suivez cette voie, gardez quelques bonnes présentations Haskell autour. Vous les comprendrez mieux si vous avez un problème à résoudre.

6
John F. Miller

Y a-t-il une raison pour laquelle ML n'est pas une de vos options? Il existe une bonne quantité de matériel d'introduction, y compris des livres et des documents de cours. Si vous aimez The Little Schemer, vous aimerez aussi The Little MLer. Enfin, vous pouvez facilement effectuer la transition vers F # plus tard. (Pas que je frappe Haskell ou Scheme - idéalement, apprenez les trois).

Aussi, un mot d'avertissement sur Emacs LISP. Je ne pense pas que Haskell ou ML vous y prépareront. Un langage Lispy comme Scheme va aider mais il y a encore des différences majeures par exemple. variables à portée dynamique. Les extensions Emacs, de par leur nature même, ont tendance à être plus impératives que fonctionnelles - elles visent toutes à modifier l'état de l'éditeur.

6
petebu

J'irais avec Haskell. Dans le schéma, vous pouvez être poussé à faire des trucs procéduraux, et son système de type n'est pas aussi utile que celui de Haskell, qui est excellent pour un débutant car il vérifie à peu près que votre code est correct à la compilation temps.

4
alternative

Je pense qu'il est facile de se laisser entraîner dans les débats sur les langues et de rater le sujet. Pour quelqu'un qui veut juste savoir de quoi il s'agit FP, les différences entre Ocaml/ML/Scheme/Haskell ne sont pas à moitié aussi importantes que votre confort avec le matériel (livres, vidéos, outils)) et si vous avez ou non un ami pour vous aider à apprendre certaines langues l'emporte sur tout le reste.

1
autodidakto

Dans l'une des réponses que vous avez reçues à votre question, j'ai trouvé ce lien assez intéressant, car il vous donne un avant-goût de Haskell et Scheme.

En plus de ce lien astucieux, voici mon point de vue sur votre question.

Si vous venez d'une formation impérative, vous risquez de mettre beaucoup d'efforts dans l'apprentissage de la programmation fonctionnelle. Je m'assurerais que l'expérience d'apprentissage n'est pas vide. C'est que vous pouvez l'appliquer à votre emploi actuel ou suivant ou que cela vous aidera d'une autre manière.

Il y a beaucoup de bonnes langues. Les Scala personnes vanteraient leur langage, tout comme les Clojure et les CL. Même les Pythonistes prétendent la paresse. D'autres personnes qui vous ont répondu ont suggéré ML. Amit Rathore qui a écrit Clojure in Action pourrait même vous suggérer d'apprendre Haskell.

Vous avez mentionné Windows et F #. Cela vous aidera-t-il dans votre position actuelle? Je ne sais rien de F #. Est-il suffisamment fonctionnel? Je le demande, car IMHO Python a des constructions fonctionnelles, mais ce n'est pas comme la programmation dans Clojure.

Pour résumer, apprenez un langage fonctionnel qui est "vraiment" fonctionnel et qui, ce faisant, est le mieux adapté à votre situation.

0
octopusgrabbus

S'il n'est pas pur, vous pouvez tout aussi bien utiliser un langage impératif, donc Haskell.

0
pyon