web-dev-qa-db-fra.com

Quels sont les concepts de base dans la programmation fonctionnelle?

Dans la programmation orientée objet, nous pourrions dire que les concepts de base sont les suivants:

  1. encapsulation
  2. héritage,
  3. polymorphisme

Que serait-ce dans la programmation fonctionnelle?

54
pierrotlefou

Il n'y a pas de consensus communautaire sur quels sont les concepts essentiels de la programmation fonctionnelle. En Pourquoi les questions de programmation fonctionnelle (PDF) , John Hughes affirme que ce sont des fonctions d'ordre supérieur et l'évaluation paresseuse. En Le port de la Cilicie: Rétrospective sur Haskell , Simon Peyton Jones dit le vrai essentiel n'est pas la paresse, mais la pureté. Richard Bird serait d'accord. Mais il y a une foule de programmeurs Scheme et ML qui sont parfaitement heureux d'écrire des programmes avec des effets secondaires.

Comme quelqu'un qui a pratiqué et enseigné la programmation fonctionnelle pendant vingt ans, je peux vous donner quelques idées qui sont largement considérées au cœur de la programmation fonctionnelle:

  • imbriqué, les fonctions de première classe avec une portée lexicale appropriée sont à la base. Cela signifie que vous pouvez créer une fonction anonyme au moment de l'exécution, dont les variables libres peuvent être des paramètres ou des variables locales d'un englobante fonction, et vous obtenez une valeur que vous pouvez revenir, mettre en structures de données, etc. . (Ceci est la forme la plus importante des fonctions d'ordre supérieur, mais certaines fonctions d'ordre supérieur (comme qsort!) Peut être écrit en C, ce qui est un langage fonctionnel.)

  • Les moyens de composer avec d'autres fonctions fonctions pour résoudre les problèmes. Personne ne le fait mieux que John Hughes.

  • De nombreux programmeurs fonctionnels croient pureté (absence d'effets, y compris la mutation, I/O, et exceptions) est au cœur de la programmation fonctionnelle. De nombreux programmeurs fonctionnels ne le font pas.

  • Polymorphisme , si elle est appliquée par le compilateur ou non, est une valeur fondamentale de programmeurs fonctionnels. Pour compliquer les choses, les programmeurs C appellent de ce concept " programmation générique. " Lorsque le polymorphisme est appliquée par le compilateur, il est généralement une variante de Hindley-Milner , mais le plus puissant système F est également une base solide pour les langages fonctionnels. Et avec des langages comme Scheme, Erlang et Lua, vous pouvez faire de la programmation fonctionnelle sans un système de type statique.

  • Enfin, une grande majorité des programmeurs fonctionnels croient en la valeur de types de données définis inductivement , parfois appelés " types récursifs ". Dans les langues avec les systèmes de type statique ceux-ci sont généralement appelés " types de données algébriques ", mais vous trouverez les types de données définis inductivement même dans documents écrits pour programmeurs débutants Scheme . types définis inductivement sont généralement expédiées avec une fonction de langage appelé motif correspondant , qui soutient une forme très générale de l'analyse de cas. Souvent, le compilateur peut vous dire si vous avez oublié un cas. Je ne voudrais pas programmer sans cette fonctionnalité de langage (un luxe une fois échantillonné devient une nécessité).

64
Norman Ramsey

En informatique, la programmation fonctionnelle est un paradigme de programmation qui traite le calcul comme étant l'évaluation des fonctions mathématiques et évite les données de l'état et des mutables. Il met l'accent sur l'application de fonctions, contrairement au style de programmation impératif, qui met l'accent sur les changements d'état. La programmation fonctionnelle a ses racines dans le calcul de la Lambda, un système formel développé dans les années 1930 pour étudier la définition de fonction, la fonction de fonction et la récursivité. De nombreuses langues de programmation fonctionnelle peuvent être considérées comme des embellissements au calcul de la Lambda. - Wikipedia

En un mot,

  1. Lambda Calculus
  2. Fonctions d'ordre supérieur
  3. Immutabilité
  4. Aucun effet secondaire
40
Ben Griswold

Pas directement une réponse à votre question, mais j'aimerais souligner que "orientée objet" et que la programmation fonctionnelle n'est pas nécessairement en attente. Les "concepts de base" que vous citez avoir plus de contreparties généraux qui s'appliquent également à la programmation fonctionnelle.

L'encapsulation, plus généralement, est la modularisation. Toutes les langues purement fonctionnelles que je connais du soutien programmation modulaire. Vous pourriez dire que ces langues implémentent l'encapsulation supérieure à la variété typique de "OO", car les effets secondaires d'encapsulation des effets secondaires et les fonctions pures n'ont pas d'effets secondaires.

Héritage, plus généralement, est implication logique, ce qui représente une fonction. Le canonique subclass -> superclass La relation est une sorte de fonction implicite. Dans les langages fonctionnels, cela est exprimé avec classes de type ou implicites (je considère que les implications sont les plus générales de ces deux).

Le polymorphisme dans l'école "OO" est atteint au moyen de sous-typing (héritage). Il existe un type de polymorphisme plus général connu sous le nom de polymorphisme paramétrique (A.K.A. Generics), que vous trouverez pour être pris en charge par des langages de programmation fonctionnelle pure. De plus, certains génériques "types plus élevés" ou génériques d'ordre supérieur (A.k.a. Polymorphisme de type constructeur ).

Ce que j'essaie de dire, c'est que vos "concepts de base de OO" ne sont pas spécifiques à OO de quelque manière que ce soit. JE, pour un, pour dire qu'il n'y a pas Tout concepts de base de OO, en fait.

14
Apocalisp

Permettez-moi de répéter la réponse que j'ai donnée à une discussion dans le groupe de programmation fonctionnelle de Bangalore:

Un programme fonctionnel est composé uniquement de fonctions. Les fonctions calculent des valeurs de leurs intrants. Nous pouvons contraster cela avec une programmation impérative, où le programme exécute, les valeurs des emplacements mutables changent. En d'autres termes, en C ou Java, une variable appelée x fait référence à un emplacement dont la valeur change. Mais dans la programmation fonctionnelle X est le nom d'une valeur (pas un emplacement). N'importe quel endroit où X est dans la portée, il a la même valeur (c'est-à-dire transparent de manière référentielle). Dans FP, les fonctions sont également des valeurs. Ils peuvent être adoptés comme des arguments à d'autres fonctions. Ceci est connu sous le nom de programmation fonctionnelle d'ordre supérieur. Les fonctions d'ordre supérieur permettent de modéliser une variété étonnante de motifs. Par exemple, consultez la fonction Carte dans Lisp. Il représente un motif où le programmateur doit faire "quelque chose" à tous les éléments d'une liste. Ce "quelque chose" est codé comme une fonction et transmis comme un argument à la carte.

Comme nous l'avons vu, la caractéristique la plus notable de FP est-il une preenne à effet secondaire. Si une fonction fait quelque chose de plus que de calculer une valeur de sa part, il provoque un effet secondaire. Telle Les fonctions ne sont pas autorisées dans Pure FP. Il est facile de tester des fonctions libres d'effet secondaire. Il n'y a pas d'état global à configurer avant d'exécuter le test et qu'il n'y a pas d'état global à vérifier après avoir exécuté le test. Chaque fonction peut être testée. Indépendamment juste en fournissant son entrée et examinant la valeur de retour. Cela facilite l'écriture de tests automatisés. Un autre avantage de la Freeness d'effet secondaire est qu'il vous donne un meilleur contrôle sur le parallélisme.

Nombreux FP Langues traitent correctement la récursion et l'itération. Ils en appuyant quelque chose appelé Tail-Récursion. Quelle éprutation de la queue est - si une fonction s'appelle lui-même, et c'est la dernière chose qu'elle fait, Il supprime tout de suite le cadre de pile actuel. En d'autres termes, si une fonction s'appelle de la queue à la queue de 1 000 fois, il ne pousse pas la pile a 1000 profond. Cela fait des constructions de bouclage spéciales inutiles dans ces langues.

Lambda Calculus est la version la plus bouillie d'un FP Langue. Niveau supérieur FP Langues comme Haskell est compilée à Lambda Calculus. Il n'a que trois constructions syntaxiques mais Il est toujours assez expressif pour représenter toute abstraction ou algorithme.

Mon avis est que FP doit être considéré comme un méta-paradigme. Nous pouvons écrire des programmes dans n'importe quel style, y compris OOP, en utilisant les abstractions fonctionnelles simples fournies par le calcul de la Lambda.

Merci, - vijay

Lien de discussion originale: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab

4
Vijay Mathew

Abstraction, processus de fabrication d'une fonction par paramétrage sur une partie d'une expression.

Application, processus d'évaluation d'une fonction en remplaçant ses paramètres avec des valeurs spécifiques.

À un certain niveau, c'est tout ce qu'il y a.

3
Doug McClean