Fonctionnel comme première langue

Réponses:

16

Un problème majeur est que si vous commencez avec une langue comme Haskell, tout le reste semblera juste inférieur aux normes.

Honnêtement, je pense que commencer avec une langue comme Haskell ou un schéma serait une excellente idée.

(J'avoue que je suis accro au langage fonctionnel) EDIT:

OK ce que j'aime dans les deux langues:

Scheme prend un langage très simple et en fait un langage de développement merveilleusement robuste. Le SICP est également écrit sur le schéma, ce qui en vaut la peine d'apprendre ici. Le schéma est la chose la plus simple que vous puissiez imaginer qui pourrait être un langage complet.

Haskell Ce qui me pousse vraiment, c'est le système de caractères. Beaucoup de bogues que je vois dans d'autres langues sont dus au mauvais type qui apparaît quelque part. À Haskell, c'est presque impossible. De plus, l'idée d'une langue paresseuse a juste quelque chose de cool qui en sort. Par exemple, vous pouvez créer des structures de données infinies dans Haskell, puis créer uniquement la pièce dont vous avez besoin.

Zachary K
la source
Pour être juste, tout un tas de langues intègrent de plus en plus d'aspects fonctionnels, donc la vie n'est plus aussi mauvaise qu'auparavant.
Tikhon Jelvis
C'est vrai, et pour quelqu'un qui aime la PF, ce n'est qu'une bonne chose
Zachary K
3
Je sais - je suggère cela comme une bonne raison d' apprendre d'abord la PF. C'est une tendance qui me rend vraiment heureuse depuis un moment.
Tikhon Jelvis
Ne dit pas vraiment grand-chose pour répondre à la question, cependant - pourquoi aimez-vous Haskell (ou Scheme)? Seraient-ils bons comme premières langues d'apprentissage? Pourquoi?
jimwise
Ajout de quelques commentaires sur les deux langues
Zachary K
6

Le plus grand avantage d'apprendre un langage fonctionnel avant d'apprendre un langage OOP est que vos compétences en programmation soient développées en premier et que vous puissiez ensuite facilement comprendre les concepts OOP. Si vous commencez directement avec un langage OOP, vous devrez apprendre deux choses simultanément: "penser au code" et "penser à l'OOD". Cela peut distraire. Entraînez-vous d'abord avec un langage fonctionnel et développez vos compétences en programmation. Apprenez ensuite la POO et d'autres paradigmes. Étant donné que la POO a été conçue pour combler les lacunes de la programmation structurelle, il sera plus facile de comprendre pourquoi. C'est la raison pour laquelle les cours CS commencent par C puis passent à C ++.

DPD
la source
1
À mon université, nous avons d'abord commencé avec un langage fonctionnel, le standard ML et avons appris quels sont les effets secondaires. Après cela, nous avons appris le C mais nous n'avons jamais appris le C ++.
Jonas
@Jonas. Je suppose que différents pays / universités ont des structures de cours très différentes. Dans mon université, le C suivi du C ++ est une norme pour les cours de génie informatique mais pour les autres filières d'ingénierie, seul le C est enseigné.
DPD
Dans mon université, nous commençons par Java, puis utilisons simplement le langage approprié pour les cours par la suite. Par exemple, C / C ++ est utilisé pour la programmation de systèmes, C # pour l'interface utilisateur, divers langages d'assemblage pour l'organisation informatique et je pense que tout ce que vous voulez pour la programmation de jeux
Carson Myers
Dans mon université, nous avons commencé par apprendre Scheme (avec SICP). Les premières semaines ont été entièrement fonctionnelles; La POO a été bien introduite dans le cours. J'ai pensé que tout était très bien organisé et j'ai plutôt aimé le cours.
Tikhon Jelvis
6

Sur la question de l' apprentissage de la programmation en commençant par la programmation fonctionnelle, deux recommandations classiques:

  • Le premier, et évident, est la structure et l'interprétation classiques des programmes informatiques , par Abelson et Sussman, qui reste l'une des meilleures introductions au CS là-bas, et est enseignée d'un point de vue fonctionnel, en utilisant Scheme. Il est entièrement disponible en ligne . Si vous ne commencez pas ici, vous devriez arriver ici à un moment donné.

  • Un texte plus récent couvrant la plupart du même terrain à un rythme plus doux, et avec un accent plus fort sur l'ingénierie logicielle est How to Design Programs , par Matthew Felleisen et un tas d'autres de l'équipe Racket / PLT, qui utilise le dialecte Racket de Schème. Il est également disponible en ligne , tout comme la deuxième édition en cours . Ce livre a l'avantage d'être conçu pour être utilisé avec l'environnement de programmation DrRacket, qui fournit une interface très conviviale pour les débutants et les experts pour expérimenter le code.

Sur la question de savoir pourquoi commencer par une programmation fonctionnelle, je voudrais signaler le blog de Bob Harper . Carnegie Mellon a récemment réorganisé son programme CS pour enseigner d'abord la programmation fonctionnelle, et Harper a couvert leurs progrès coup par coup sur son blog. En tant que l'un des gars derrière la définition de ML standard, il est évident qu'il est pour ce mouvement, et il en explique bien les raisons.

Enfin, je vous déconseille d'apprendre d'abord Haskell, bien que d'autres puissent être en désaccord. Alors que l'approche pure de Haskell en matière de PF engendrera certainement de bonnes habitudes, l'accent mis par le langage sur le calcul paresseux n'est pas nécessairement un bon match pour le débutant; L'une des premières et des choses les plus importantes que vous devrez apprendre à faire en tant que programmeur est de raisonner exactement ce que fait votre programme en regardant la source, et sur le coût relatif des différentes approches du même problème. D'après mon expérience, la paresse de Haskell fait de ces deux activités un défi pour les programmeurs même expérimentés, bien que votre kilométrage puisse varier.

Jimwise
la source
5

Le principal avantage (ou non-inconvénient) du démarrage avec FP est que la plupart des concepts peuvent également s'appliquer à la programmation impérative. Realm of Racket utilise des analogies de jeux vidéo pour enseigner des concepts fonctionnels et impératifs, et les étudiants dévoués se retrouvent non seulement avec un jeu fonctionnel (npi), mais une solide compréhension des conditions, de la récursivité, des boucles, des ADT et de la conception événementielle. Ces concepts sont pratiquement omniprésents dans la programmation moderne et sont constamment utilisés.

Encore plus important, cependant, est d'apprendre à coder des abstractions , quelque chose dans lequel FP excelle, avec l'utilisation de fonctions et de types de données d'ordre supérieur. Comment concevoir des programmes adopte une approche unique à cet égard en enseignant par induction. Par exemple, les élèves apprennent comment foldfonctionne en examinant le code pour prendre à la fois la somme et le produit d'une liste, trouver ce qu'ils ont en commun et dériver l'implémentation eux-mêmes.

L'équivalent POO de ce qui précède impliquerait probablement un ou plusieurs des éléments suivants: interfaces, classes abstraites, génériques, foncteurs ou (si vous le faites mal) singletons. Bien que ce soient des modèles de conception parfaitement acceptables en Java, à mon humble avis, ils n'appartiennent pas à un programme d'introduction et ne servent qu'à masquer les principes sous-jacents. Même en tant que personne qui a été initiée aux langages de PF "tardivement", je peux dire que la navigation dans la mer en constante évolution de la POO a été considérablement facilitée grâce à un solide ancrage fonctionnel.

punaise
la source
Presque oublié: si vous voulez acheter Royaume de Racket, essayez ce coupon: RACKETEERS. Je ne sais pas quand il expire, désolé.
bug
+1 pour mentionner les fonctions d'ordre supérieur - j'étais prêt à publier ma propre réponse à leur sujet. La moitié de mes collègues ont du mal avec le concept, et le reste qui les comprend ne pense pas à eux quand ce serait la solution la plus simple.
Izkata
1
Je n'avais pas entendu parler de Realm of Racket, mais le titre a immédiatement su de quoi il s'agissait, car le titre fait référence à son frère aîné, Land of Lisp.
Magus
4

La programmation fonctionnelle rend les choses beaucoup plus faciles. Dans les langages POO, vous devez gérer la gestion de l'état sur plusieurs threads sans ruiner cet état. Dans les langages fonctionnels, lorsque la majorité du travail effectué est effectué par des fonctions pures, vous n'avez pas à vous en soucier.

En termes de vitesse / performance, je ne suis pas un vrai jockey de performance, mais être fonctionnel ne signifie pas être lent, et la structure des langages fonctionnels n'a pas grand-chose à voir avec leur vitesse. La syntaxe des langages fonctionnels varie considérablement, comme les différences entre Clojure et Haskell. Clojure est très rapide en l'état et peut atteindre (et parfois dépasser) les vitesses de Java avec une optimisation après coup.

Donc tout dépend vraiment de ce que vous cherchez

MattyD
la source
2

Je pense que la disponibilité de matériel d'apprentissage, de bons exemples de code et de mentors sont très importants lors de l'apprentissage des langages de programmation. Selon votre situation, vous pouvez avoir un mentor qui peut vous enseigner, etc. mais je pense que les ressources linguistiques fonctionnelles sont très peu nombreuses par rapport aux langues traditionnelles. Cela signifie que vous progresserez plus lentement que l'apprentissage des langues traditionnelles. Mais si vous n'êtes pas pressé, ce n'est pas un problème.

Endy Tjahjono
la source
1
Je pense que vos hypothèses sont fausses. Il y a de bons tutoriels, livres, articles, etc. sur les choses fonctionnelles. De plus, il y a beaucoup d'articles qui traitent de choses spéciales comme le système de type, l'implémentation, les machines virtuelles, le calcul lambda et ainsi de suite.
Ingo
1

La raison la plus importante pour envisager l'apprentissage de langages de programmation fonctionnels est peut-être la compréhension des types de données algébriques. La cartographie mentale aidera à modéliser les relations de classe OO et même la conception de bases de données.

L'accent mis sur les systèmes multicœurs / multiprocesseurs met l'accent sur l'utilisation d'algorithmes parallèles qui peuvent être exprimés plus clairement et de manière plus concise en FP. La branche lambda des langues verra probablement une forte augmentation de son utilisation au cours des une à deux prochaines décennies.

Mais il y a aussi des pièges courants. Croire que FP est plus simple est une grosse erreur, car le calcul de la complexité de l'espace et du temps ainsi que la fourniture de preuves d'arrêt peuvent être beaucoup plus difficiles dans le calcul lambda, en particulier dans les langues qui prennent en charge l'évaluation paresseuse.

Alors, apprenez les deux! Ou peut-être mieux: apprenez d'abord une langue qui englobe les deux, comme le scala. Si cela ne vous dérange pas les t-shirts tie-die et un léger accent hollandais, vous trouverez peut-être utiles les conférences de FP du Dr Erik Meijer , qui sont sur MSDN.

Dibbeke
la source