Schéma vs Haskell pour une introduction à la programmation fonctionnelle?


36

Je suis à l'aise avec la programmation en C et C # et explorerai le C ++ dans le futur. Je pourrais être intéressé à explorer la programmation fonctionnelle en tant que paradigme de programmation différent. Je le fais pour le plaisir, mon travail ne nécessite pas de programmation informatique et je suis quelque peu inspiré par l'utilisation de la programmation fonctionnelle, enseignée assez tôt, dans des cours d'informatique à l'université. Le calcul lambda est certainement au-delà de mes capacités mathématiques, mais je pense pouvoir gérer la programmation fonctionnelle.

Lequel de Haskell ou Scheme serait une 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 d'apprendre Emacs Lisp. D'après ce que j'ai compris, 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 le voir feuilleté). Ou utiliserais le "Apprenez-vous un Haskell pour le plus grand bien" si je poursuis Haskell. Je voudrais également regarder les vidéos Intro to Haskell du Dr Erik Meijer sur Channel 9.

Toutes les suggestions, commentaires ou contributions ont été appréciés.

Merci.

PS BTW: J’ai également accès à F # depuis Visual Studio 2010 que j’utilise pour le développement C #, mais je ne pense pas que cela devrait être mon principal critère de sélection d’une langue.


3
N'oubliez pasReal World Haskell
alternative le

15
Commentaire secondaire mineur: le lambda calcul est un système extraordinairement simple; La bonne chose à ce sujet n’est pas que ce soit complexe, mais le contraire; que vous puissiez exprimer tout ce que vous voulez dans un système aussi simple. Commencez avec un langage de programmation; Maintenant, jetez TOUT, sauf les références de variable, les définitions de fonction et les appels de fonction. Voila! Lambda calcul.


9
Je peux vous apprendre le lambda calcul en cinq minutes. Maintenant, comprendre les conséquences de ce que vous venez d'apprendre nécessite toute une vie. :)

5
J'ai choisi Haskell plutôt que Scheme principalement parce qu'il n'y a pas beaucoup de parenthèses!
Joey Adams

Réponses:


27

Je recommanderais OCaml.

Selon mon point de vue personnel, les programmations fonctionnelles modernes reposent principalement sur des fonctions d'ordre supérieur, un système de types statiques, des types de données algébriques et la recherche de motifs.

Entre un régime, un ML et un Haskell, je choisirais le ML parce que je pense que c'est le plus pertinent pour cette définition. Scheme n'a pas de typage statique (il y a Typed Racket, mais ce n'est pas pour les débutants), et Haskell a trop d'autres trucs (monades, évaluation paresseuse ...) qui, bien qu'intéressants, 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 agréable (mais si vous voulez vraiment "pratique" au risque de perdre votre âme, vous pouvez également choisir F #).

Scheme et Haskell sont également des langues très intéressantes. L’accent mis par les schémas sur les macros est intéressant, mais n’est pas directement lié à la programmation fonctionnelle (c’est une autre chose dans le monde que vous devriez absolument essayer, ainsi qu’à la programmation logique, aux langages basés sur la pile et à l’E orienté sur les capacités).

Haskell est définitivement un excellent langage et, à mon avis, un point impératif pour les gourous en herbe de la programmation fonctionnelle. Mais comme les langues de base d'OCaml et de Haskell sont très similaires (à l'exception de l'évaluation paresseuse qui gêne le débutant), il est facile d'apprendre Haskell une fois que vous maîtrisez les bases d'OCaml. Ou plutôt, vous pouvez vous concentrer sur les trucs étranges, sans avoir à 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 souhaitez en savoir plus, vous devriez regarder Coq ou Agda. Pourtant, peu de gens recommanderaient Coq ou Agda pour une première introduction à la programmation fonctionnelle ...

Pour que mon propos soit clair: je pense qu'apprendre OCaml (ou SML) puis Haskell fera de vous un aussi bon programmeur fonctionnel qu'apprendre directement Haskell, mais plus facilement (ou moins péniblement).
En outre, OCaml et Haskell ont tous deux bonnes choses qui les différencient, et il est intéressant de connaître les fonctionnalités avancées de deux . Apprendre que 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 que vous serez plus frustré).

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

¹ cette définition est controversée. Certains spécialistes du schéma prétendent que le typage statique n’a rien à voir avec la programmation fonctionnelle. Certains Haskell vont prétendre 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. Je suis d'accord pour être en désaccord.


3
Merci de m'avoir poussé vers OCaml, et oui je vais risquer mon âme et explorer F #. Je développe pour Linux, Mac OS X et Windows (principalement l’ancien), mais FSI semble être disponible pour les trois plates-formes (mono sous Linux et Mac OS X), ce que je fais déjà. Le fait que tout le poids de Microsoft soit derrière un langage de programmation fonctionnel (même un langage "impur") devrait être salué plutôt que décrié par les fans de programmation fonctionnelle.
Haziz

SML est mort, ocaml existe pour écrire coq
permeakra

1
+1 pour ML; c'est plus clair que Haskell.
m3th0dman

Je trouve aussi que c'est une bonne idée d'apprendre SML ou OCaml, puis Haskell (+1). Après avoir connu ces langues, en choisir une autre (par exemple, le scala) est très facile. De plus, on pourrait regarder Scheme, Common Lisp et Clojure (dans cet ordre), pour avoir une idée des langages dynamiques.
Giorgio

@haziz: Même lorsqu'ils créent de bons logiciels, Microsoft (ou d'ailleurs Oracle, etc.) reste un monopole, avec toutes les mauvaises pratiques impliquées, telles que le verrouillage du client, des formats incompatibles, des implémentations incompatibles, etc.
Giorgio

26

Si vous êtes intéressé par les concepts plus avancés de la programmation fonctionnelle, optez pour Haskell. Il existe un système de types approprié et une interdiction stricte de la mutation. Cependant, Haskell n’est pas pour les timides.

Si vous voulez juste une introduction à la conception fonctionnelle, optez pour Scheme. La syntaxe est beaucoup plus facile à apprendre et à lire. Cela permet la programmation procédurale, mais il suffit de vous discipliner pour ne pas utiliser de procédure avec un !en fin de nom.

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


4
"La syntaxe est beaucoup plus facile à apprendre et à lire" est très subjective.

6
@luqui: Vrai. Peut-être que «régulier» est un meilleur mot. Pas de backticks, infixes, précédents, ou problèmes d'associativité - juste des parenthèses, beaucoup de parenthèses infernales et stupides.
Hoa Long Tam

17

La réponse correcte 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 aimé le petit Schemer. Vous comprendrez certainement les concepts de base de la programmation fonctionnelle après l'avoir traversée (et vous aurez un endroit où mettre vos taches de gelée!)

Je suis à peu près au quart de Learn You a Haskell pour le plus grand bien. J'apprécie beaucoup cela aussi, mais les deux livres ne pourraient pas être plus différents. Learn You a Haskell a une approche très traditionnelle pour enseigner une langue spécifique. Le petit Schemer est spécifique à Scheme, bien sûr, mais il est beaucoup plus concerné par l’enseignement des bases de la programmation fonctionnelle, et non du langage de Scheme.

Je recommande vivement de commencer par le petit Schemer. C'est moins pratique, mais plus fondamental.


17

Mes deux cents en ce qui concerne la programmation fonctionnelle est de ne pas rester accroché à un langage particulier, mais d’apprendre les concepts clés de la programmation fonctionnelle. J'ai appris la programmation fonctionnelle en étant jeté tête la première dans un projet dans lequel mon patron insistait pour que tout le développement soit réalisé en APL. APL est un langage de traitement de tableaux fonctionnel et est aussi éloigné de LISP, de Haskell ou de tout autre langage de programmation grand public que vous pouvez obtenir. Le véritable avantage, c’est quand j’ai trouvé qu’une fois que j’ai «assimilé» le paradigme de la programmation fonctionnelle et appris mentalement à décomposer automatiquement un problème en un programme fonctionnel, je n’étais plus vraiment intimidé par les aspects idiomatiques d’autres langages fonctionnels comme Haskell, OCaml, Scheme, Scala et Clojure. JE'

Si je devais choisir un premier langage fonctionnel, je choisirais probablement Haskell ou Steel Bank Common Lisp (SBCL). Pour Haskell, je lirais Apprenez-vous un Haskell ... , Le monde réel Haskell , La route de Haskell vers la logique, les mathématiques et la programmation , et des perles de conception d'algorithmes fonctionnels . Pour CL, je lirais Land of Lisp , Programmation des paradigmes de l'intelligence artificielle et (si vous êtes vraiment hardcore), laissez-vous sur Lambda . Vous pouvez combiner tous ces livres pour obtenir un aperçu général des approches et des concepts de programmation fonctionnelle pratiques.

J'envisagerais également l'apprentissage de Clojure et Scala, car ils sont à la fois de très bons langages fonctionnels et très expressifs (malgré ce que les puristes de FP pourraient dire).


6

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

OTOH, Scheme, 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 qui rend les choses 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 statique. Cela signifie que vous pouvez commencer par le truc "facile" et apprendre à utiliser un langage fonctionnel. Plus tard, vous pourrez vous développer et utiliser la variante typée et la paresseuse. Ils devraient être plus faciles maintenant, puisque vous devez traiter une fonctionnalité à la fois. Pour être clair, les conceptsseront assez nouveaux pour que la question syntaxique soit mineure et surtout sans importance. En d'autres termes, une fois que vous commencez à vous familiariser avec 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égante - mais c'est aussi parce qu'elle est très loin de votre syntaxe moyenne C / C # / C ++.)

Cela dit, je pense qu’il ya aussi un bon point pour F #: vous dites que vous le faites de manière accessoire, mais lorsque vous apprendrez la PF, vous voudrez bientôt utiliser tous ces bons trucs. Utiliser F # signifie que vous pouvez faire plus de choses "réelles" puisqu'il est probablement facile de résoudre le même type de problèmes que vous rencontrez dans votre travail quotidien. Idéalement, vous en arriverez à un point où vous verriez l’avantage d’utiliser cela par exemple en C # et que vous utiliserez dans certains projets. Donc, bien que vous ayez raison de ne pas choisir F # uniquement parce que vous y avez facilement accès, vous devriez le prendre en compte, car rien de mieux utiliserces nouveaux concepts. En revanche, si vous utilisez Scheme ou Haskell et que vous le considérez comme un langage de jouet (même si vous savez que certaines personnes l'utilisent pour de vraies applications), vous ne prendrez jamais tout cela au sérieux. [Mais YMMV, il est principalement basé sur des observations subjectives et peut varier considérablement d'une personne à l'autre.]


6

Y at-il une raison pour laquelle ML ne soit pas une de vos options? Il existe une bonne quantité de matériel d'introduction disponible, y compris des livres et des documents de cours. Si vous aimez The Little Schemer, vous aimerez peut-être aussi The Little MLer. Enfin, vous pouvez facilement effectuer la transition vers F # ultérieurement. (Non pas que je frappe Haskell ou Scheme - idéalement apprendre les trois).

En outre, un mot d'avertissement à propos d'Emacs Lisp. Je ne pense pas que Haskell ou ML vont vous préparer. Un langage comme Lispy aidera, mais il existe 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 ont toutes pour objectif de modifier l'état de l'éditeur.


Merci de m'avoir poussé vers ML / OCaml, et oui je vais "risquer mon âme" et explorer F #. Je développe pour Linux, Mac OS X et Windows (principalement l’ancien), mais FSI semble être disponible pour les trois plates-formes (mono sous Linux et Mac OS X), ce que je fais déjà. Le fait que tout le poids de Microsoft soit derrière un langage de programmation fonctionnel (même un langage "impur") devrait être salué plutôt que décrié par les fans de programmation fonctionnelle.
Haziz

D'ailleurs, j'ai commandé The Little MLer chez Amazon et je l'ai déjà reçu et commencé mon Journey. Je viens également d'ajouter Learning F # à ma bibliothèque. Semble être un guide d’enseignement plus traditionnel, que je vais utiliser pour compléter The Little MLer.
Haziz

6

Ecrivez-vous un Scheme dans 48 heures (en haskell)

Je le recommande vraiment. Vous allez apprendre Haskell en utilisant un problème réel et intéressant, et vous apprendrez la meilleure leçon à tirer en jouant avec l'interprète que vous construisez. Si vous choisissez cette voie, gardez quelques bonnes introductions de Haskell. Vous les comprendrez mieux si vous avez un problème à résoudre.


En fait, j'ai utilisé ce wiki / pdf pour apprendre Haskell et améliorer mes compétences en OCaml (en traduisant Haskell idiomatique en OCaml). Ce serait plutôt cool si quelqu'un pouvait prendre ce matériel et le "transformer" en plusieurs langages fonctionnels. Pourrait être la base d'une fusillade en langage fonctionnel très cool!
Marc

1
Le principal problème avec ceci est qu’il introduit le parsec sans introduire de monades.
alternative le

@Alternative Parsec possède une interface monadique, mais il possède également une interface applicative, sans oublier de nombreuses autres fonctions. Il n'est pas déraisonnable d'introduire Parsec avant la généralisation monadique
Philip JF

4

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


3
"à peu près vérifie que votre code est correct" est très faux. Aucun système de type ne peut le faire. (À moins que votre système typographique soit un véritable prouveur de théorèmes.)
Eli Barzilay

4
@ Ali, avez-vous utilisé Haskell? Bien que théoriquement cette affirmation soit évidemment fausse, dans la pratique, je la trouve plutôt exacte, du moins en comparaison avec toutes les autres langues que j'ai utilisées. Cela dit, je ne suis pas du tout d'accord pour dire que c'est un bon choix pour un débutant. Quand j'apprends les ficelles du métier, je préférerais voir précisément ce que mon code a mal fait, plutôt que de laisser le compilateur me crier que c'est faux et qu'il est difficile de le combattre quand je ne connais même pas le vocabulaire utilisé par les messages d'erreur.

1
@ Ali "à peu près" est le terme clé ici. En Haskell, vous passez plus de temps à réfléchir à la manière de le mettre en œuvre, ce qui se fait assez facilement. Ensuite, vous le vérifiez pour vous assurer que vos cartes, vos plis, etc. sont sains d'esprit.
alternative le

@Eli Barzilay: Le système de typographie de Haskell semble vraiment très proche de la démonstration de théorèmes. Cela a certainement créé un environnement où les prouveurs de théorèmes semblent presque plus communs que d'autres outils. (Non pas que
j'implique

@luqui - Oui, je l'ai utilisé; non, c'est toujours une fausse déclaration, à la fois en pratique et en théorie. Ce n'est pas quelque chose qui est unique à Haskell cependant.
Eli Barzilay

1

Je pense qu'il est facile de se perdre dans des débats sur les langues et de passer à côté de l'essentiel. Pour quelqu'un qui veut juste savoir ce qu'est la PF, les différences entre Ocaml / ML / Scheme / Haskell ne sont pas aussi importantes que votre confort d'utilisation du matériel (livres, vidéos, outils) que vous utilisez pour l'apprendre. Et si vous avez ou non un ami pour vous aider à apprendre une certaine langue l'emporte sur tout le reste.


0

Si ce n'est pas pur, vous pouvez aussi bien utiliser un langage impératif, donc Haskell.


0

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

En plus de ce lien astucieux, voici ma réponse à votre question.

Si vous venez d'un contexte de programmation impérative, vous devrez peut-être déployer beaucoup d'efforts pour apprendre la programmation fonctionnelle. Je voudrais m'assurer que l'expérience d'apprentissage n'est pas vide. C'est-à-dire que vous pouvez l'appliquer à votre emploi actuel ou à votre prochain emploi ou que cela vous aidera d'une autre manière.

Il y a beaucoup de bonnes langues là-bas. Les Scala vantent leur langue, de même que les Clojures et les CL. Même les pythonistes revendiquent la paresse. D'autres personnes qui vous ont répondu ont suggéré ML. Amit Rathore, qui a écrit Clojure dans 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-ce assez fonctionnel? Je demande cela, parce que 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, convient le mieux à votre situation.


-2

Du point de vue d'un débutant, je suggère de ne pas commencer par le SICP si vous choisissez Scheme, à moins que vos calculs soient assez matures. Le livre et les vidéos sont remplis de subtilités et ne sont pas du tout intuitifs pour un débutant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.