Réponses:
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.
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 ++.
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.
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 fold
fonctionne 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.
RACKETEERS
. Je ne sais pas quand il expire, désolé.
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
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.
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.