56 votes

Quels sont les concepts de base en programmation fonctionnelle?

En programmation orientée objet, on pourrait dire que les concepts de base sont les suivants:

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

Qu'est-ce que ce serait en programmation fonctionnelle?

65voto

Norman Ramsey Points 115730

Il n'y a pas de consensus de la communauté sur ce que sont les concepts essentiels de la programmation fonctionnelle. Dans Pourquoi la Programmation Fonctionnelle, les Questions, de John Hughes affirme qu'ils sont des fonctions d'ordre supérieur et d'évaluation différée. En Portant le cilice: Une Rétrospective sur Haskell, Simon Peyton Jones affirme que la vraie essentiel n'est pas de la paresse, mais la pureté. Richard Bird serait d'accord. Mais il y a toute une foule de Régime et ML programmeurs 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 il y a largement soupçonné d'être au cœur de la programmation fonctionnelle:

  • Imbriquées, de première classe de fonctions avec une bonne portée lexicale sont à la base. Cela signifie que vous pouvez créer une fonction anonyme au moment de l'exécution, dont les variables libres peut-être des paramètres ou des variables locales d'une enveloppant de la fonction, et vous obtenez une valeur que vous pouvez retourner, mettre en structures de données, et ainsi de suite. (C'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 n'est pas un langage fonctionnel.)

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

  • De nombreux fonctionnelle programmeurs croire à la pureté (la liberté d'effets, y compris la mutation, I/O, et les exceptions) est à la base de la programmation fonctionnelle. De nombreux fonctionnelle programmeurs ne sont pas.

  • Polymorphisme, si elle est appliquée par le compilateur ou pas, est une valeur fondamentale de la fonctionnelle de programmeurs. Point de prêter à confusion, les programmeurs en C++ appeler ce concept de "programmation générique." Lorsque le polymorphisme est appliquée par le compilateur, c'est une variante de Hindley-Milner, mais le plus puissant Système de F est aussi un puissant outil de base pour les langages fonctionnels. Et avec des langages comme Régime, Erlang, et Lua, vous pouvez faire de la programmation fonctionnelle sans un système de type statique.

  • Enfin, une grande majorité de la fonctionnelle de programmeurs de croire en la valeur de l' induction des types de données définis, parfois appelé "récursive types". Dans les langues avec le type statique de systèmes de celles-ci sont généralement connus comme des "types de données algébriques", mais vous trouverez de façon inductive les types de données définis, même dans des documents écrits pour commencer un Régime de programmeurs. De façon inductive les types définis généralement livrés avec un langage appelé pattern matching, qui prend en charge 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 veux pas de programme sans cette fonctionnalité du langage. (Un luxe à la fois échantillonné devient une nécessité.)

41voto

Ben Griswold Points 6949

En informatique, la programmation fonctionnelle est un paradigme de programmation qui traite de calcul de l'évaluation des fonctions mathématiques et évite d'état et de données mutable. Il met l'accent sur l'application de fonctions, contrairement à l'impératif de style de programmation, qui met l'accent sur les changements dans l'état. La programmation fonctionnelle a ses racines dans le lambda calcul, un système formel développé dans les années 1930 pour enquêter sur la définition de la fonction, la fonction de l'application, et la récursivité. De nombreux langages de programmation fonctionnelle peuvent être considérés comme des embellissements pour le lambda calcul. - Wikipédia

En un mot,

  1. Lambda Calcul
  2. Des Fonctions D'Ordre Supérieur
  3. L'immutabilité
  4. Pas d'effets secondaires

13voto

Apocalisp Points 22526

Pas directement la réponse à votre question, mais je tiens à souligner que "orienté objet" et programmation fonctionnelle ne sont pas nécessairement contradictoires. Les "concepts de base" que vous citez ont plus générale homologues qui s'appliquent aussi bien à la programmation fonctionnelle.

L'Encapsulation, de manière plus générale, la modularisation. Tous purement fonctionnelle des langues que je sais de soutien à la programmation modulaire. Vous pourriez dire que ces langues en œuvre de l'encapsulation de mieux que le "OO" de la variété, depuis les effets secondaires de briser l'encapsulation, et les fonctions pures ont pas d'effets secondaires.

L'héritage, plus généralement, est l' implication logique, qui est ce que une fonction représente. L'canonique subclass -> superclass relation est une sorte d'implicite de la fonction. Dans les langages fonctionnels, cela est exprimé avec des classes de type ou implicites (je considère implicites pour être le plus général de ces deux).

Le polymorphisme dans le "OO" de l'école est assurée par la sous-typage (héritage). Il y a un plus grand type de polymorphisme connu comme polymorphisme paramétrique (un.k.un. les génériques), que vous trouverez à être pris en charge par pure-langages de programmation fonctionnelle. En outre, un certain soutien "de plus en plus de types", ou d'ordre supérieur génériques (un.k.un. constructeur de type polymorphisme).

Ce que j'essaie de dire, c'est que vos "concepts de base de l'OO" ne sont pas spécifiques à l'OO en aucune façon. Pour ma part, je dirais qu'il n'y a pas toutes les concepts de base de l'OO, en fait.

4voto

Vijay Mathew Points 17155

Permettez-moi de répéter la réponse que j'ai donné à une discussion dans le Bangalore Programmation Fonctionnelle du groupe:

Un programme fonctionnel se compose uniquement de fonctions. Fonctions de calcul des valeurs de leurs entrées. Nous pouvons, en revanche impératif programmation, où que le programme s'exécute, les valeurs de mutable les emplacements de changement. En d'autres termes, en C ou en Java, une variable appelée X fait référence à un emplacement dont le changement de valeur. Mais fonctionnelle la programmation de X est le nom d'une valeur (pas un lieu). N'importe où que X est dans la portée, il a la même valeur (j'.e, il est referentially transparent). Dans la FP, les fonctions sont aussi des valeurs. Ils peuvent être transmis en tant que arguments à d'autres fonctions. Ceci est connu comme ordre supérieur fonctionnel de la programmation. Fonctions d'ordre supérieur laissez-nous le modèle d'une variété incroyable de les schémas. Par exemple, regardez la carte en fonction Lisp. Il correspond à un modèle où le programmeur doit faire "quelque chose" pour chaque élément d'une liste. "Quelque chose" est codé comme une fonction et passé comme argument à la carte.

Comme nous l'avons vu, la caractéristique la plus notable de la PF est il des effets secondaires l'indice d'égouttage. Si une fonction n'est quelque chose de plus que le calcul d'une valeur dès l'entrée, puis il est à l'origine d'un effet secondaire. De telles fonctions sont pas admis dans le plus pur FP. Il est facile de tester sans effets secondaires fonctions. Il n'y a pas d'état global pour mettre en place avant de lancer le test et il mondial de l'etat pour vérifier, après l'exécution du test. Chaque fonction peut être testé indépendamment juste en lui donnant de l'entrée et de l'examen de la valeur de retour. Cela rend plus facile d'écrire des tests automatisés. Un autre l'avantage de l'effet de l'indice d'égouttage est qu'il vous donne un meilleur contrôle sur le parallélisme.

De nombreux FP langues traiter la récursivité et itération correctement. Ils ont fait cela en soutenir quelque chose qui s'appelle la queue de la récursivité. Ce tail-recursion est - si une fonction s'appelle elle-même, et c'est la dernière chose qu'il fait, il enlève la pile en cours cadre. En d'autres termes, si un la fonction s'appelle elle-même la queue-de manière récursive un 1000 fois, il ne pousse pas la pile de 1000 profonde. Ce qui rend spécial boucles inutile dans ces langues.

Lambda Calcul est le plus cuit version d'une langue FP. Niveau supérieur FP langages comme Haskell compilé pour Lambda Le calcul. Il n'a que trois des constructions syntaxiques, mais encore il est assez expressif pour représenter une abstraction ou un algorithme.

Mon avis est que FP doit être considéré comme un méta-paradigme. Nous pouvons écrire des programmes dans tous les styles, y compris la programmation orientée objet, à l'aide de la simple fonctionnelle abstractions fournies par le Lambda Calcul.

Merci, -- Vijay

Origine de discussion lien: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab3

3voto

Doug McClean Points 6355

Abstraction, processus de création d'une fonction en paramétrant une partie d'une expression.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X