J'aimerais apprendre une langue fonctionnelle afin d'élargir mon horizon. J'ai une connaissance de Python et C / C ++ et je veux qu'une langue soit facile à apprendre de quelqu'un qui vient du domaine impératif des langues. Je m'en fiche si la langue est assez puissante. Je veux juste une langue afin d'apprendre la base de la programmation fonctionnelle, puis je vais essayer d'une langue plus difficile (et plus puissante). P>
merci p>
6 Réponses :
Je recommande Pure-Lang pour ces extrémités pédagogiques. C'est aussi beaucoup puissant. Si vous voulez quelque chose de plus populaire / avec un soutien plus communautaire, alors je recommanderais Scheme ou OCAML, selon que vous préférez traiter de la syntaxe inconnue (aller avec le schéma) ou de traiter d'abord de la typographie inconnue (aller avec OCAML). SML et F # ne sont que légèrement différents de OCAML. D'autres ont ou mentionneront Clojure, Scala et Haskell. P>
Clojure est une variante de schéma, avec ses propres idiosyncracies (par exemple aucune optimisation de l'appel de la queue), il serait donc un moyen de commencer par un système. Je m'attendrais à ce que vous ayez plus de facilité avec une implémentation de régime moins idiosyncratique cependant. Raquette est ce qui est souvent utilisé pour l'enseignement. Scala cherche à être fondamentalement similaire à OCAML, mais celui-ci est basé uniquement sur la familiarité décontractée. P>
Contrairement à Haskell, les autres langues mentionnées ont toutes deux avantages: (1) L'ordre d'évaluation est désireux par défaut, bien que vous puissiez obtenir une évaluation paresseuse en le demandant spécifiquement. Dans Haskell's l'inverse. (2) La mutation est disponible, bien que la plupart des bibliothèques et du code que vous verrez ne l'utilisent pas. En fait, je pense qu'il est préférable d'apprendre une programmation fonctionnelle tout en respectant la manière dont il interagit avec des effets secondaires et de votre chemin vers une composition de style monadique quelque peu sur la route. Donc, je pense que c'est un avantage. Certains vous diront qu'il est préférable d'être jeté dans la manipulation plus en quarantaine de Haskell de Mutaton d'abord, cependant. P>
Robert Harper à la CMU a quelques bons articles de blog sur l'enseignement de la programmation fonctionnelle . Si je comprends bien, il préfère également des langues comme OCAML pour enseigner. P>
Parmi les trois classes de langues que j'ai recommandées (pure, schéma et amis, ocaml et amis), les deux premiers ont une dactylographie dynamique. Les premier et troisième ont des cellules de référence explicites (comme dans Python, vous vous limitez de ne jamais réaffecter une variable, mais vous pouvez toujours modifier ce qui est stocké à un indice de liste). Schéma a des cellules de référence implicites: les variables elles-mêmes sont mutables, comme dans C et Python, et la manipulation des cellules de référence se fait sous les couvercles. Dans des langues comme ça, vous avez souvent une forme de cellule de référence explicite disponible également (comme dans l'exemple que je viens de donner en python ou en utilisant des paires / listes mutables dans la raquette ... dans d'autres régimes, y compris la norme de régime, celles-ci sont les paires / listes par défaut). p>
Une vertu Haskell a fait que certains manuels sont apparus pour cela. (Je veux dire ceci sincèrement, pas snarkily.) Quels livres / ressources à utiliser est une autre question controversée avec de nombreuses guerres / questions fermées. SICP comme d'autres personnes ont recommandé de nombreux fans ainsi que des critiques. Il me semble que j'ai beaucoup de bons choix. Je ne vais pas vous aventurer plus loin dans ces débats. P>
Cette question est probablement hors sujet car elle va entraîner des guerres de langues sans fin, mais voici un avis général: p>
Il existe une classe de langages de programmation fonctionnelle parfois appelés "principalement fonctionnels", en ce sens qu'ils permettent de certaines caractéristiques impératives où vous les souhaitez. Les exemples incluent standard ml, ocaml, f # et scala. Vous pouvez en considérer l'un d'entre eux si vous voulez pouvoir obtenir une prise en main sur le style idiomatique fonctionnel tout en étant capable de réaliser des choses de manière raisonnablement familière. P>
J'ai utilisé de manière approfondie la norme dans le passé, mais si vous recherchez quelque chose qui a un peu moins de courbe d'apprentissage, je recommanderais personnellement Scala, qui est mon deuxième langage de programmation préféré. Les raisons de cette question incluent la prévalence des bibliothèques, une communauté de la taille d'une bonne santé et la disponibilité des belles livres et des tutoriels pour vous aider à démarrer (en particulier si vous avez déjà eu des relations avec Java). P>
Je me demande si la capacité de revenir au style impératif lorsque vous souhaitez devenir un obstacle d'apprendre le style fonctionnel.
La question de la question a spécifiquement demandé "le plus facile à apprendre", alors que je suis d'accord que le fait d'avoir une baisse impérative pourrait ne pas être la meilleure stratégie à long terme, il réduit la courbe d'apprentissage de telle sorte que vous n'ayez pas à apprendre comment IO fonctionne dans un puissant réglage en même temps que tout le reste :)
Ouais, je m'attends à ce que cette question soit fermée bientôt.
Au début, la structure de lecture et la mise en œuvre de programmes informatiques. Je recommande Lisp (pour, exemple, son schéma dialecte) en tant que première langue de programmation fonctionnelle. P>
Je suis d'accord avec votre suggestion. J'ai moi-même profité beaucoup de SICP et faire les exercices. Je recommanderai également fortement d'étudier SICP.
Éventuellement le nom du livre est structure et interprétation de programmes informatiques i>
Une autre option est la clojure, que je suis donnée à comprendre est plus "purement" fonctionnelle que Scheme / Racket (ne me pose pas de questions sur les détails ici) et éventuellement suffisamment similaire pour vous permettre de l'utiliser conjointement avec SICP ( Structure et interprétation des programmes informatiques, un livre hautement recommandé également suggéré par une autre réponse). P>
Un élément qui n'a pas été discuté est la disponibilité de la syntaxe spéciale correspondante des modèles de données algébriques, comme dans Haskell, toutes les saveurs de ML, et probablement plusieurs des autres langues mentionnées. La syntaxe de correspondance des motifs a tendance à aider le programmateur à voir leurs fonctions comme mathématiques em> fonctions. La syntaxe de Haskell est suffisamment complexe et ses implémentations ont des messages d'erreur d'analyse suffisamment pauvres, que la syntaxe est une raison décente de ne pas choisir Haskell. Le schéma est probablement plus facile à apprendre que la plupart des autres options (et le schéma propose probablement le roi de tous les systèmes macro), mais le manque de syntaxe correspondant à la correspondance des motifs m'éloignerait de l'introduction à une programmation fonctionnelle. P>
Je suis tout à fait d'accord sur l'importance de la correspondance des motifs dans l'apprentissage de la programmation fonctionnelle. Je pense que cela va être disponible avec plus ou moins de travail sur la plupart ou tous les choix. De nombreuses implémentations de schéma ont un motif correspondant au moins comme une extension; Raquette l'a nativement. Une version de mise en œuvre-agnostique est distribuée avec le manuel essentiel des langages de programmation. Par tous signifie que quelqu'un d'apprentissage de la FP avec système devrait veiller à exploiter ces installations.
Mon souvenir est que la syntaxe de correspondance de motif dans la raquette est beaucoup moins lisible et écritable que la syntaxe de le faire en ml. Suis-je confus? Le fait que la raquette n'a pas de datatypes algébriques (bien que la sous-language du Plaï fasse un très bon travail de simuler) aggrave les choses.
@DFeuer J'ai discuté de cette longueur avec la communauté LISP lorsque j'avais choisi entre Lisp et Ocaml. Les Lispers répondraient que LISPS pourrait ne pas avoir de fichiers de données algébriques, mais ils ont des macros qui vous permettent d'écrire votre propre bibliothèque correspondante de modèle qui est encore plus puissante, car vous pouvez faire une unification complète. Cependant, la correspondance des motifs est omniprésente dans OCAML, F #, HASKELL et SCALA, tandis que l'unification est presque inouïe dans Lisp, schéma, raquette et clojure. Je pense donc que c'est juste de dire que les lispers ont perdu celui-là. La correspondance des motifs est extrêmement précieuse, ce qui rend le mls beaucoup mieux que les Lisps.
@Andrewc, je ne connais aucune de l'histoire, mais il semble que cvs.hakell.org n'existe plus. Je parierais que depuis que tout le reste Haskell est passé à Git ou à Darcs, personne ne voulait plus maintenir l'infrastructure CVS plus soutenir une mise en œuvre obsolète.
J'aimerais apprendre une langue fonctionnelle afin d'élargir mon horizon. J'ai une connaissance de Python et C / C ++ et je veux qu'une langue soit facile à apprendre de quelqu'un qui vient du domaine impératif des langues. Je m'en fiche si la langue est assez puissante. Je veux juste une langue afin d'apprendre la base de la programmation fonctionnelle, puis je vais essayer d'une langue plus difficile (et plus puissante). P> blockQuote>
Grande question! p>
J'avais fait de base, Pascal, Assembleur, C et C ++ avant de commencer à effectuer une programmation fonctionnelle à la fin des années 90. Ensuite, j'ai commencé à utiliser deux langues fonctionnelles à peu près au même moment, Mathematica et OCAML, et utilisiez-les exclusivement dans quelques années. Ocaml m'a laissé écrire un code impératif qui ressemblait au code que j'avais écrit auparavant. J'ai trouvé que précieux comme un apprenant parce que cela me permettait de comparer les différentes approches qui ont fait les avantages de ML évident. P>
Cependant, comme d'autres personnes ont mentionné, l'avantage de base de Mathematica et OCAML est une correspondance de modèle et qui n'est pas techniquement liée à la programmation fonctionnelle. J'ai ensuite examiné de nombreuses autres langues fonctionnelles, mais je n'ai aucun désir de retourner à une langue qui manque de motif correspondant. P>
Haskell est souvent recommandé d'apprendre le paradigme fonctionnel car il est pur. Ce n'est pas facile, mais peut-être que vous pourriez être confus en mélangeant un paradigme procédural et fonctionnel dans d'autres langues (Scala et autres).
Orme. elm-lang.org