Quels sont les principaux concepts de la programmation fonctionnelle?
En programmation orientée objet, on pourrait dire que les concepts de base sont:
- encapsulation
- héritage,
- polymorphisme
Ce que ce serait dans la programmation fonctionnelle?
- Pourquoi croyez-vous que ce sont les concepts de base de la programmation orientée objet? De nombreux langages à objets n'ont pas d'encapsulation (par exemple, Python, CLOS). Certains langages à objets n'ont pas d'héritage (Auto, JavaScript, et tout autre prototype de base de la langue), et certains le font, mais ce n'est pas une grosse affaire (pratiquement n'importe quel langage dynamique, ou toute autre langue avec le duck-typing). La seule chose qui est réellement commun à tous est polymorphisme d'exécution.
- De wikipedia: "Armstrong, Les Quarks de Développement Orienté Objet. Dans l'ordre décroissant de popularité, les "quarks" sont: les droits de Succession, d'Objet, de Classe, d'Encapsulation, de la Méthode, de la transmission de Message, le Polymorphisme, l'Abstraction"
- Nosredna, et pas un seul d'entre eux a une signification précise.
- Minaev: +1; mais je dirais que l'encapsulation n'est pas nécessairement la vie privée (privé), juste le couplage de l'état et de processus (les méthodes de voyage avec l'objet comme une seule unité). Si oui, l'encapsulation est commun à tous les Oups je connais, et sans doute encore plus "de base", que le polymorphisme.
- D'accord. Pas de signification précise. Je pense que l'encapsulation est l'idée la plus importante associée avec OO. Mais c'est juste moi. Les quarks sont à partir de 40 ans d'OO la littérature. Je ne peux que faire confiance que tous ces gens ont écrit au sujet de quelque chose.
- Hey! J'ai réussi à obtenir le mot de "quelque chose" en italique! Je suis gagnant de StackOverflow pour ce soir!
- Phlogiston, matériel, trous noirs, et la programmation orientée objet. Il existe d'autres exemples de l'imaginaire des entités de l'objet de nombreux écrits par des gens très intelligents.
- L'un des problèmes de l'encapsulation est la mise en œuvre de Tests Unitaires. Comme je l'ai lu plusieurs fois, le créateur des tests est un autre utilisateur qui est suffisamment important pour "casser" certains principes. Si nous surprotéger la conception, nous ne laissons pas ce travail de l'utilisateur. Il y a certaines techniques en fonction de la langue pour encapsuler pour les utilisateurs finaux et le laisser ouvert pour l'unité de test des écrivains, mais le principe est quelque chose à discuter.
Vous devez vous connecter pour publier un commentaire.
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 Questions (PDF), John Hughes affirme qu'ils sont des fonctions d'ordre supérieur et d'évaluation différée. Dans Porter les Cheveux Chemise: 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 qui sont largement considérées être à la base 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 enfermant 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 dans C, ce qui n'est pas un langage fonctionnel.)Moyens de composition de fonctions avec 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 F est également 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 croyons en la valeur de inductif types de données définis par, 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 le matériel écrit pour début 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é).
En sciences de l'informatique, de 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,
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.
D'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 pur les fonctions n'ont pas d'effets secondaires.
Héritage, plus généralement, est 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 les classes de type ou implicites (je considère implicites pour être le plus général de ces deux).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 tout concepts de base de l'OO, en fait.
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.
Grâce,
-- Vijay
Origine de discussion lien: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab3
L'Abstraction, le processus de fabrication d'une fonction par le paramétrage sur une partie d'une expression.
Application, le processus de l'évaluation d'une fonction par le remplacement de ses paramètres avec des valeurs spécifiques.
À un certain niveau, c'est tout là est à lui.