Vraiment comprendre la différence entre procédure et fonctionnelle
Je vais vraiment avoir du mal à comprendre la différence entre de procédure et fonctionnelle paradigmes de programmation.
Voici les deux premiers paragraphes de l'article de Wikipédia sur de la programmation fonctionnelle:
En informatique, fonctionnelle
la programmation est un paradigme de programmation
qui traite de calcul que les
évaluation de fonctions mathématiques
et évite d'état et de données mutable. Il
met l'accent sur l'application de
fonctions, contrairement à la
la programmation impérative de style, 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 étudier
définition de la fonction, la fonction
d'application, et la récursivité. De nombreux
langages de programmation fonctionnelle peut
être considérées comme des élaborations sur la
lambda calcul.Dans la pratique, la différence entre un
fonction mathématique et la notion
d'une "fonction", utilisés dans l'impératif
la programmation est impératif que
les fonctions peuvent avoir des effets secondaires,
la modification de la valeur de programme de l'état.
En raison de ce qui leur manque référentielle
la transparence, c'est à dire la même langue
l'expression peut entraîner différents
les valeurs à différents moments selon
l'état de l'exécution de programme.
À l'inverse, dans le code fonctionnel, l'
valeur de sortie d'une fonction
uniquement sur les arguments d'entrée
à la fonction, de sorte que l'appel d'une fonction
f
deux fois avec la même valeur pour un
argumentx
produira le même
résultatf(x)
les deux fois. L'élimination de
les effets secondaires peuvent rendre beaucoup plus facile
pour comprendre et prédire le comportement
d'un programme, qui est l'un des principaux
les motivations pour le développement de
la programmation fonctionnelle.
Au paragraphe 2, où il est dit
À l'inverse, dans le code fonctionnel, la valeur de sortie d'une fonction dépend uniquement sur les arguments d'entrée de la fonction, de sorte que l'appel d'une fonction
f
deux fois avec la même valeur d'un argumentx
produira le même résultatf(x)
deux fois.
N'est-ce pas exactement le même cas pour la programmation procédurale?
Que doit-on chercher dans la procédure vs fonctionnelle qui se démarquent?
- Le "Charmant Python: Fonctionnelle Programmation en Python" lien de Abafei a été brisé. Voici un bon jeu de liens: ibm.com/developerworks/linux/library/l-prog/index.html ibm.com/developerworks/linux/library/l-prog2/index.html
- Un autre des aspects de cette appellation. Par exemple. en JavaScript et en Common Lisp, nous utilisons le terme de fonction, même s'ils sont autorisés effets secondaires et dans le Schéma i même est toujours appelé proceduere. Une CL fonction de ce qui est pur peut être écrit comme un pur Schéma fonctionnel de la procédure. Presque tous les livres sur le Schéma utilise le terme de la procédure, puisque c'est le tyerm utilisé dans la norme et il n'a rien à voir avec procedureal ou fonctionnelle.
Vous devez vous connecter pour publier un commentaire.
De La Programmation Fonctionnelle
De la programmation fonctionnelle se réfère à la capacité de traiter les fonctions en tant que valeurs.
Prenons une analogie avec le "régulier" des valeurs. On peut prendre deux valeurs entières et de les combiner à l'aide de la
+
opérateur afin d'obtenir un nouveau entier. Ou on peut multiplier un nombre entier par un nombre à virgule flottante à obtenir un nombre à virgule flottante.En programmation fonctionnelle, on peut combiner deux valeurs de la fonction pour produire une nouvelle valeur de la fonction à l'aide des opérateurs comme composer ou ascenseur. Ou on peut combiner une fonction de la valeur et une valeur de données pour produire une nouvelle valeur de données à l'aide des opérateurs comme carte ou fois.
Remarque que de nombreuses langues ont fonctionnelle des capacités de programmation -- même dans des langues qui ne sont pas généralement considérés comme des langages fonctionnels. Même grand-Père FORTRAN pris en charge les valeurs de la fonction, bien qu'il n'offre pas beaucoup de la manière de la fonction combinant les opérateurs. Pour qu'une langue soit disant "fonctionnelle", il doit embrasser la programmation fonctionnelle des capacités dans une grande manière.
Programmation Procédurale
Programmation procédurale se réfère à la capacité d'encapsuler une commune de la séquence d'instructions dans une procédure, de sorte que ces instructions peut être appelé à partir de nombreux endroits, sans avoir recours au copier-coller. Que les procédures ont été très précoce de développement dans la programmation, la fonctionnalité est presque toujours lié avec le style de programmation exigé par la machine ou de l'assemblée de la programmation en langue: un style qui met l'accent sur la notion de lieux de stockage et les instructions de déplacer des données entre ces endroits.
Contraste
Les deux styles ne sont pas vraiment opposés, ils sont juste différents l'un de l'autre. Il y a des langues qui embrasse les deux styles (LISP, par exemple). Le scénario suivant peut donner une idée des différences entre les deux styles. Nous allons écrire un peu de code pour un non sens où nous voulons déterminer si tous les mots dans une liste d'un nombre impair de caractères. Tout d'abord, style procédural:
Je vais le prendre comme un donné que cet exemple est compréhensible. Maintenant, style fonctionnel:
De travail de l'intérieur, cette définition ne fait les choses suivantes:
compose(odd, length)
combine lesodd
etlength
fonctions pour produire une nouvelle fonction qui détermine si la longueur d'une chaîne est impair.map(..., words)
appels nouvelle fonction pour chaque élément danswords
, en fin de compte le retour d'une nouvelle liste de valeurs booléennes, chaque indiquant si le mot correspondant a un nombre impair de caractères.apply(and, ...)
s'applique l'opérateur "et" à la liste des résultats, et-ing tous les booléens ensemble pour donner le résultat final.Vous pouvez le voir sur ces exemples, que la programmation procédurale est très concernée par le déplacement des valeurs dans des variables et explicite décrivant les opérations nécessaires pour produire le résultat final. En revanche, le style fonctionnel met l'accent sur la combinaison des fonctions requises pour transformer l'entrée initiale de la sortie finale.
L'exemple montre également l'typiques de la taille relative de la procédure contre le code fonctionnel. En outre, il démontre que les caractéristiques de performance du code de procédure pourrait être plus facile à voir que le code fonctionnel. Considérer: les fonctions de calculer les longueurs de tous les mots de la liste, ou est-ce que chaque arrêtez immédiatement après avoir trouvé la première même longueur de mot? D'autre part, le code fonctionnel permet une grande qualité de mise en œuvre pour effectuer quelques jolies optimisation grave, car il exprime principalement intention plutôt qu'un algorithme explicite.
Lecture
Cette question revient beaucoup... voir, par exemple:
John Backus' prix Turing conférence des sorts les motivations pour la programmation fonctionnelle en détail:
Peut de Programmation d'Être Libérée de la von Neumann Style?
J'ai vraiment ne devrait pas parler de ce document dans le contexte actuel parce que c'est assez technique, assez rapidement. Je ne pouvais pas résister parce que je pense que c'est vraiment fondamental.
Addendum - 2013
Commentateurs font remarquer que les langues modernes offrent d'autres styles de programmation, au-dessus de procédure et de fonctions. Ces langues offrent souvent un ou plusieurs des éléments suivants styles de programmation:
Voir les commentaires ci-dessous pour des exemples de la façon dont le pseudo-code des exemples dans cette réponse peut bénéficier de certains des équipements disponibles à partir de ces autres styles. En particulier, l'exemple de procédure permettra de bénéficier de l'application de pratiquement n'importe quel niveau supérieur de construire.
L'exposé des exemples délibérément d'éviter de mélanger dans ces autres styles de programmation, afin de souligner la distinction entre les deux styles en cours de discussion.
odd_words(words)
définition fait quelque chose de différent que la réponse estallOdd
. Pour le filtrage et la cartographie, des interprétations de la liste sont souvent privilégiées, mais ici, la fonctionallOdd
est censé réduire une liste de mots pour une seule valeur de type boolean.and
doit avoir été unif
en fait (ou on peut aussi utiliser l'opérateur conditionnel).allOddWords words = let oddWordLenghs = compose(and, map(compose(odd, length)) in apply( oddWordLenths, words)
[functional programming] primarily expresses intent rather than an explicit algorithm.
La vraie différence entre fonctionnelle et la programmation impérative est l'état d'esprit impératif programmeurs sont la pensée de variables et blocs de mémoire, alors que fonctionnelle programmeurs de penser, "Comment puis-je transformer mes données d'entrée dans mes données de sortie" - votre "programme" de l'oléoduc et d'un ensemble de transformations sur le données à prendre à partir de l'Entrée à la Sortie. C'est la partie intéressante de l'OMI, et non le "Tu ne dois pas utiliser les variables" bit.
Comme une conséquence de cet état d'esprit, FP généralement les programmes de décrire ce va arriver, au lieu de le mécanisme spécifique de comment il va se passer - c'est puissant parce que si nous pouvons énoncer clairement ce que l' "Select" et "Où" et "Global" signifie, nous sommes libres d'échanger leur mise en œuvre, tout comme nous le faisons avec AsParallel() et tout à coup notre single-threaded application des échelles à n cœurs.
Non, parce que le code de procédure peut avoir des effets secondaires. Par exemple, il peut stocker de l'état entre les appels.
Cela dit, il est possible d'écrire du code qui répond à cette contrainte dans les langues considérées comme de procédure. Et il est aussi possible d'écrire du code qui s'affranchit de cette contrainte dans certaines langues, considérées comme fonctionnelles.
Je suis en désaccord avec WReach de réponse. Nous allons déconstruire sa réponse un peu pour voir où le désaccord vient de.
Tout d'abord, son code:
et
La première chose à noter est qu'il est l'amalgame entre:
de programmation, et manquant de la capacité pour itératif style de programmation pour avoir plus explicite de flux de contrôle d'un typique style fonctionnel.
Passons rapidement en parler.
Expression centrée sur le style en est une où les choses, autant que possible, évaluer de choses. Bien que les langages fonctionnels sont connus pour leur amour des expressions, il est possible d'avoir un langage fonctionnel sans composable expressions. Je vais faire un, où il y a pas expressions, que des déclarations.
C'est à peu près la même que celle donnée précédemment, sauf les fonctions sont enchaînés uniquement au travers de chaînes de déclarations et de liaisons.
Un itérateur centrée sur le style de programmation peut être pris par Python. Nous allons utiliser un purement itératif, iterator centrée sur le style:
Ce n'est pas fonctionnel, car chaque clause est un processus itératif, et ils sont liés ensemble par explicite pause et reprise de la pile d'images. La syntaxe peut être inspiré en partie à partir d'un langage fonctionnel, mais il est appliqué à un complètement itératif incarnation d'elle.
Bien sûr, vous pouvez compresser ce:
Impératif n'a pas l'air si mal maintenant, hein? 🙂
Le point final a été plus explicite de flux de contrôle. Nous allons réécrire le code original de faire usage de cette:
Utilisation des itérateurs, vous pouvez avoir:
Donc ce est au point d'un langage fonctionnel si la différence entre:
La principale caractéristique définitive d'un langage de programmation fonctionnel, c'est qu'il supprime la mutation dans le cadre de la typique du modèle de programmation. Souvent, les gens prennent cela pour dire qu'un langage de programmation fonctionnel n'a pas de déclarations ou recours à des expressions, mais ce sont des simplifications. Un langage fonctionnel remplace explicite le calcul avec une déclaration de comportement, dont la langue n'effectue ensuite une réduction sur.
Restreindre vous-même à ce sous-ensemble de la fonctionnalité vous permet d'avoir plus de garanties sur vos logiciels de comportements, et cela vous permet de composer plus librement.
Lorsque vous avez un langage fonctionnel, de faire de nouvelles fonctions est généralement aussi simple que de composer étroitement liées à des fonctions.
Ce n'est pas simple, ou peut-être même pas possible, si vous n'avez pas explicitement contrôlé mondiale dépendances d'une fonction. La meilleure caractéristique de la programmation fonctionnelle, c'est que vous pouvez toujours créer plus générique des abstractions et de la confiance qu'ils peuvent être combinés dans un ensemble plus grand.
apply
n'est pas tout à fait le même fonctionnement que unefold
oureduce
, si je suis d'accord avec la belle capacité à avoir de très algorithmes génériques.apply
à direfold
oureduce
, mais il me semble qu'il doit être, dans ce contexte, le retour d'un booléen.Dans le cadre de procédures de paradigme (dois-je dire "programmation structurée" à la place?), vous avez partagé mutable de la mémoire et des instructions de lecture/écriture dans une séquence (l'un après l'autre).
Dans le paradigme fonctionnel, vous avez des variables et des fonctions (dans le sens mathématique: les variables ne varient pas au fil du temps, les fonctions ne peuvent calculer en fonction de ses entrées).
(C'est simplifié à l'extrême, par exemple, FPLs ont généralement des facilités pour travailler avec des mutable mémoire alors que les langages procéduraux peuvent souvent d'ordre supérieur procédures afin que les choses ne sont pas aussi claires; mais ce devrait vous donner une idée)
La Charmant Python: Fonctionnelle programmation en Python de IBM Developerworks m'a vraiment aidé à comprendre la différence.
Surtout pour quelqu'un qui sait Python un peu, les exemples de code dans cet article dans lequel faire des choses différentes sur le plan fonctionnel et sur le plan procédural sont en contraste, permet de clarifier la différence entre la procédure et la programmation fonctionnelle.
En programmation fonctionnelle, afin de raisonner sur le sens d'un symbole (variable ou un nom de fonction) vous avez seulement besoin de savoir 2 choses -- champ d'application actuel et le nom du symbole. Si vous avez un point de vue purement fonctionnel de la langue avec l'immuabilité de ces deux sont "statiques" (désolé pour le mal surchargé de nom) concepts, ce qui signifie que vous pouvez voir à la fois -- la portée actuelle et le nom -- juste en regardant le code source.
En programmation procédurale, si vous voulez répondre à la question quelle est la valeur de derrière
x
vous devez également savoir comment vous y êtes arrivé, la portée et le nom seul ne suffit pas. Et c'est ce que j'allais voir comme le plus grand défi parce que ce chemin d'exécution est un "runtime" de la propriété et peut dépendre de beaucoup de choses différentes, que la plupart des gens apprennent à juste le débogage et de ne pas essayer de récupérer le chemin d'exécution.J'ai récemment eu la pensée de la différence en termes de L'Expression De Problème. Phil Wadler description est souvent cité, mais le a accepté de répondre à cette question est probablement plus facile à suivre. Fondamentalement, il semble impératif que les langues ont tendance à choisir une approche du problème, tandis que les langages fonctionnels ont tendance à choisir les autres.