Question

L'une des caractéristiques principales de la programmation fonctionnelle est l'utilisation des fonctions latérales effectless. Cependant, cela peut se faire dans un langage impératif aussi. La même chose est vraie pour les fonctions de récursion et lambda (par exemple, C ++ 0x). Par conséquent, je me demande si les langages de programmation impératifs sont plus nombreuses que les fonctionnels.

Était-ce utile?

La solution

D'une manière générale, non; la programmation fonctionnelle est un sous-ensemble de programmation déclarative (qui comprend les langages de programmation logiques, comme Prolog). De nombreuses langues impératives empruntent des éléments à des langages de programmation fonctionnels, mais simplement avoir lambdas ou fonctions référentielle transparentes ne font pas un langage impératif fonctionnel; la programmation fonctionnelle est plus que seulement ces éléments.

Autres conseils

Je ne peux pas vraiment dire si elles sont sous-ensemble d'un autre. Ce que je peux dire, cependant, que (sauf pour les langues vraiment ésotériques) ils sont tous Turing-complet , ce qui signifie qu'en fin de compte, ils sont tous aussi puissants, mais pas neccesarily tout aussi expressif.

Un paradigme est une façon de faire les choses, et il y a deux paradigmes de programmation principaux: impératifs et déclaratifs. Le fait que certaines langues permettent de mélanger les deux paradigmes ne signifie pas que l'on est inclus dans l'autre, mais que les langues sont multiparadigme .

Pour clarifier un peu plus, laissez-moi continuer avec votre analogie: si Lisp et OCaml (par exemple) sont considérés comme des langages fonctionnels, et les deux permettent un style impératif ... alors impératif devrait être considéré comme un sous-ensemble de fonction ?

Il est possible de mettre en œuvre un certain paradigme de programmation dans une langue qui ne supporte pas nativement le paradigme de programmation. Par exemple il est possible d'écrire objet code orientée objet en C alors qu'il n'a pas été conçu à cet effet.

Programmation fonctionnelle est un paradigme de programmation bien développé son propre et est le mieux appris à travers les langues comme Haskell, Lisp, etc. Et après les avoir bien appris, même si vous ne l'utilisez régulièrement ces langues, vous pouvez commencer à utiliser les principes dans la journée à la langue de jour que vous utilisez sur une base régulière.

Certaines personnes peuvent, comme Google pour rel="nofollow programmation orientée objet en C

Langues les plus impératives ne disposent pas de fonctions que les types de premier ordre, alors que la plupart o functionald. (Comme le fait C ++, par fonction boost ::.)

Par type de premier ordre, ce MEAS une valeur / variable peut être de tout type, un int, un bool, une fonction à partir int> bool. Souvent, il comprend des fermetures ou des valeurs liées aussi bien, où vous avez la même fonction, mais certains arguments sont déjà remplis.

Ces deux sont ce que la programmation fonctionnelle est la plupart du temps au sujet, à mon humble avis.

Je pense qu'il pourrait être utile d'établir une distinction entre paradigme et langue .

Pour moi, paradigmes représentent "façons de penser" (concepts et des abstractions telles que les fonctions, les objets, récursivité), alors que langues Offre "manières de faire" (syntaxe, variables, évaluations).

Tous les vrais langages de programmation sont équivalentes dans le sens où ils sont Turing-complet et capable, en théorie, pour calculer une fonction Turing-calculable ainsi que Simuler ou être simulé par une machine de Turing universelle.

La chose intéressante est combien il est difficile d'accomplir certaines tâches dans certaines langues ou paradigmes, comment l'outil approprié est à la tâche. Même le jeu de la vie de Conway est Turing-complet, mais cela ne me fait pas envie de programmer avec.

De nombreuses langues prennent en charge un certain nombre de paradigmes. C ++ a été conçu comme une extension orientée objet pour C, mais il est possible d'écrire du code de procédure purement en elle.

Certaines langues empruntent / acquérir des fonctionnalités d'autres langues ou paradigmes au fil du temps (il suffit de regarder l'évolution de Java).

Quelques langues, comme Common Lisp, sont impressionnantes langues multi-paradigme. Il est possible d'écrire du code qui est fonctionnel, orienté objet ou à la procédure en Lisp. On peut dire que, l'aspect orientation fait déjà partie du système d'objets Common Lisp, et donc « rien de spécial ». En Lisp, il est facile d'étendre le langage lui-même pour faire tout ce que vous avez besoin de faire, donc on l'appelle parfois le « langage de programmation programmable ». (Je signale ici que Lisp décrit une famille de langues dont le Common Lisp est seulement un dialecte).

Je pense qu'il n'a pas d'importance des termes, déclaratives, impératives, fonctionnels ou de procédure, est un sous-ensemble qui. Ce qui importe plus est de comprendre les langues des outils avec lesquels vous travaillez, et comment ceux-ci sont différents des autres outils. Plus important encore est de comprendre les différentes façons de penser que les paradigmes représentent, puisque ce sont vos pensées outils. Comme avec la plupart des autres choses dans la vie, plus vous comprenez, vous le plus efficace devient.

Une façon de regarder (ne dis pas que c'est la bonne façon « parce que je ne suis pas un designer lang ou théoricienne par tout moyen) est que si la langue est essentiellement converti en quelque chose d'autre, alors que « autre chose » doit être le surensemble de la source. Donc bytecode est nécessairement une surcouche de Java. .NET IL est un surensemble de C # et F #. Les constructions fonctionnelles en C # (à savoir LINQ) sont donc un sous-ensemble des constructions impératives d'IL.

Le langage machine est impératif, vous pouvez prendre la position que, par conséquent, toutes les langues sont impératives, car ils ne sont que abstractions utiles pour les humains qui sont ensuite évaporée par le compilateur en code machine de procédure, impératif.

mappage des modèles comme

f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)

est quelque chose qui est, par exemple, une chose qui est pas disponible dans les langues impératives. construit aussi comme des fonctions cari:

add2 :: int -> int
add2 = (2 +)

ne sont pas disponibles dans les langues les plus impératives

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top