Question

Telle est la situation: je programme principalement C # et possède des types écrits que je ne veux pas perdre. En même temps, j'aimerais apprendre la programmation fonctionnelle. La réponse évidente est bien sûr F #.

Mais pour tout ce qui est mis à part C #, j’utilise emacs en tant qu’éditeur et j’aimerais vraiment apprendre Lisp. (Apprenez le langage de vos rédacteurs / IDE, vous savez, c'est pourquoi je connais un peu le VB pour écrire mes macros VS.) Et ce n'est pas juste emacs, Lisp est quelque chose que je veux vraiment apprendre.

En ce qui concerne F #, je pouvais le mélanger avec C # sans aucun problème d’interopérabilité, disposer d’une excellente interface graphique (WPF) et de nombreux autres éléments .NET. Mais il n’est bien sûr pas aussi mature que Lisp.

Si je suis réaliste, je sais que si je veux introduire un langage fonctionnel dans ma vie professionnelle, il faut que ce soit F #. Puisque l’apprentissage de deux langues entières me semble un peu compliqué, j’espérais que Lisp serait un excellent moyen d’apprendre la programmation fonctionnelle, et si je commençais plus tard, ce serait très facile.

Est-ce vrai? Ou les deux langues ne sont-elles pas du tout comparables?

Était-ce utile?

La solution

Lisp est une grande famille de langages et d'implémentations. Le schéma, par exemple, est un dialecte Lisp avec probablement plus de cent implémentations (une dizaine d'entre elles moyennement populaires). Common Lisp est un autre dialecte avec environ dix implémentations actuellement maintenues. Scheme et Common Lisp ont tous deux des normes écrites que les implémentations tentent de mettre en œuvre.

F # est à la fois un langage et une implémentation. De Microsoft. Il est principalement dérivé d’OCAML et appartient à la famille des langages ML.

Lisp était un langage très précoce supportant la programmation fonctionnelle (Lisp 1.5 dans les années 60). Bon nombre des premières expériences de programmation fonctionnelle ont été effectuées à Lisp. Dans les années 70, dans la communauté Lisp, il y avait un mouvement vers les racines de la programmation fonctionnelle et le résultat était un Scheme . Puis, surtout dans les années 80 et 90 du siècle dernier, de nouveaux langages fonctionnels (ML, Miranda, FP, SML, Haskell, Clean, ...) qui étaient / étaient très différents des dialectes Lisp habituels. Il existe encore un héritage, mais ils ont principalement évolué dans différentes directions (typage statique, inférence de type, systèmes de modules, langages de lot, types de données algébriques, évaluation paresseuse, pureté, etc.). La communauté du programme a encore beaucoup de contacts avec la communauté de la PF. Mais c'est surtout ça.

Certaines idées de base sur la PF peuvent être apprises indépendamment d’un langage particulier, mais en général, F # est très différent de la plupart des dialectes Lisp. L’autre fonctionnalité, à savoir que F # prend en charge l’écosystème .net (d’autant plus qu’il s’agit d’une création Microsoft), n’est pas très bien prise en charge par les dialectes Lisp.

Je ne m'attendrais pas non plus à connaître un dialecte Lisp restreint comme Emacs Lisp pour l'apprentissage du F #.

Autres conseils

Je pense qu'il n'y a qu'un petit "chevauchement" de ce que vous auriez appris via Common Lisp versus F #. Le point commun est je pense à peu près

  • Programmer avec "cons-lists" comme type de données fondamental commun, écrivant parfois des fonctions récursives (particulièrement récursives) plutôt que des boucles
  • Quelques utilisations de base des fonctions communes d'ordre supérieur (par exemple, "map": applique une fonction à chaque valeur d'une liste)

Mis à part certains aspects très fondamentaux de la programmation fonctionnelle, je pense que Common Lisp et F # sont à peu près aussi éloignés l'un de l'autre que ne le peuvent deux langages «fonctionnels» (non-Haskell) classiques. Common Lisp est dynamique; F # est statiquement typé. Les formes syntaxiques sont complètement différentes. Les temps d'exécution sont complètement différents. Les bibliothèques sont très différentes. Les systèmes d'objet sont complètement différents.

Quel que soit l'ordre dans lequel vous les apprenez, je pense qu'après avoir appris l'un, il restera encore beaucoup à apprendre dans l'autre (modulo, le petit chevauchement que j'ai décrit plus haut).

F # est le plus comparable à la famille de langages ML, tels que SML et CAML. La syntaxe et les fonctionnalités sont différentes de Lisp.

Mais je pense qu'apprendre au moins un langage fonctionnel est vraiment important du point de vue de l'informatique. Pouvoir penser ainsi, c'est bien.

Et, dirais-je, apprendre un langage plus purement fonctionnel avant de commencer F # serait un moyen d’acquérir de bonnes habitudes de programmation fonctionnelle car, si vous ne le faites pas, votre code F # pourrait devenir plus OO et moins fonctionnel, parce que c'est de là que vous venez.

À mon avis, il existe deux approches pour apprendre la programmation fonctionnelle:

  1. Utilisez un langage fonctionnel plus pur comme Lisp ou Haskell qui forceront vous sortir d'une procédure état d'esprit tout de suite; ou

  2. Utiliser un langage fonctionnel pragmatique comme F # qui offre aussi plus familier, mais moins fonctionnel, construit pour vous aider à vous y frayer un chemin.

Dans les deux cas, vous tirerez un meilleur parti de l'expérience d'apprentissage si vous pouvez faire quelque chose d'utile avec le langage. Il semble que vous ayez une motivation pour Lisp (Emacs) et F # (.NET interop). Je voudrais donc jeter un coup d’œil à la fois et voir ce qui attire votre attention.

En fin de compte, la compréhension des concepts de programmation fonctionnelle (fonctions d'ordre supérieur, aucun effet secondaire, récursivité, etc.) est plus utile que n'importe quel langage. Et une fois que vous aurez appris ces concepts, il sera beaucoup plus facile de choisir de nouveaux langages et d’appliquer les techniques dans d’autres langages (comme le C # de plus en plus fonctionnel). Dans le même ordre d'idées, la Programmation fonctionnelle pour le monde réel peut vous intéresser.

Deux choses importantes à considérer sont:

  • LISP est typé dynamiquement alors que F # est typé statiquement.
  • LISP a une macro intégrée. F # non.

Bien qu'ils soient considérés comme fonctionnels et partagent de nombreuses caractéristiques communes, ils sont également différents. Apprendre à utiliser LISP fera certainement de vous un meilleur programmeur F # et vice-versa, mais vous devrez tout de même apprendre les particularités des deux pour pouvoir être pratique.

Pour pouvoir interagir avec .NET, je choisirais certainement le F #, mais par souci de beauté, je voudrais aussi essayer LISP.

Ce sont deux langages fonctionnels mais syntaxiquement, ils sont très différents. Cela signifie que beaucoup des concepts seront similaires et que vous (en tant que développeur procédural) devrez faire de même pour vous, mais ce sont des langages très différents.

F # est un dérivé de ML (considéré, avec tous ses dérivés, pour être un langage fonctionnel impur) alors que Lisp est plus ancien et réputé être un " pur " langage fonctionnel.

La pureté d'un langage fonctionnel est un sujet fascinant et je vous recommande de lire Pureté de la langue et fonctions sales et propres pour mieux comprendre le concept:

  

Beaucoup de gens parlent de " pure "   langages fonctionnels, où " pure "   semble être un synonyme de "bon".   Il y a deux traits communément   associé à la définition d'un   langage fonctionnel pur:

     
      Les fonctions
  1. ne peuvent pas avoir d’effets secondaires
  2.   
  3. une fonction appelée avec n'importe quel argument retournera toujours le même   valeur.
  4.   

Je ne connais que F #, mais j’ai étudié Lisp avant F # et je pense que cela a été très utile pour contextualiser F # dans le cadre .NET et dans toute la gamme des langages de programmation.

Je recommande vivement de regarder au moins les premières vidéos ici:

http://groups.csail.mit. edu / mac / classes / 6.001 / abelson-sussman-lectures /

Ils vous apprennent les bases de Lisp dès la première heure. La série s’appuie sur ces connaissances et instille les principes passionnants qui en découlent.

La sémantique de F # et de Scheme est très similaire, à l'exception notée du typage fort.

En outre, Scheme est si petit que vous ne devez pas l’apprendre!

En tant que langage de programmation, Lisp est assez spécial, mais il n’est pas du tout similaire à F #, à la différence qu’ils supportent tous les deux la programmation fonctionnelle. Peu de constructions de langage sont reportées de Lisp à F #. Si vous voulez apprendre Lisp allez-y. L'idée de la programmation fonctionnelle ne reportera pas sur la syntaxe. Lisp est vraiment vieux, fin des années 50. De nombreuses langues en ont été influencées et il existe de nombreux dialectes.

Si vous cherchez seulement un langage purement fonctionnel à apprendre avant le F #, je vous suggère Haskell. Haskell a été fortement influencé par ML et constitue un bon langage de transition vers F #, car F # est un dérivé de ML. Vous pouvez consulter le code Haskell et voir des modèles similaires dans le code F #.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top