Que signifie “pure” par pure “langage fonctionnel”?
Haskell a été appelé un "langage purement fonctionnel."
Que signifie "pur" dans ce contexte? Quelles sont les conséquences de ceci pour un programmeur?
- La conséquence est que vous ne pouvez pas utiliser d'autres paradigmes de programmation (par exemple, orienté objet. Aussi, ce doit être des devoirs?
- Non, vous pouvez (mais il peut y avoir une différence d'impédance); cela signifie qu'il n'y a pas d'effets secondaires.
- Je parlais des conséquences plutôt que les sens.
- Kettler: l'Absence d'effets secondaires fonctionne très bien avec la programmation orientée objet; en fait, la popularité des objets immuables est une étape précisément dans cette direction.
- Voir homepages.cwi.nl/~ralf/OOHaskell
- Une conséquence est: le programmeur ne peut pas tirer facilement hinself dans le pied en plus.
- spécifiquement Haskell ne peut pas faire l'héritage virtuel, mais cela est dû à sa typeclass, pas parce qu'elle est pure. Déclarative langues peut avoir l'héritage virtuel (je suis en train de travailler sur une).
Vous devez vous connecter pour publier un commentaire.
Dans un pur fonctionnelle de la langue, vous ne pouvez pas faire quelque chose qui a un effet secondaire.
Un effet secondaire signifierait que l'évaluation d'une expression changements à l'interne de l'état qui serait plus tard la cause de l'évaluation de la même expression pour avoir un résultat différent. Dans un langage purement fonctionnel, vous pouvez évaluer la même expression aussi souvent que vous le souhaitez avec les mêmes arguments, et il serait toujours retourner la même valeur, car il n'est pas en état de changement.
Par exemple, un langage purement fonctionnel ne peut pas avoir un opérateur d'affectation ou de faire d'entrée/sortie, bien que pour des raisons pratiques, même pur les langages fonctionnels souvent appel impur bibliothèques pour faire des I/O.
seq
etunsafePerformIO
, mais c'est le sentiment général. Mieux encore: "Dans un "pur" langage fonctionnel, vous pouvez remplacer n'importe quelle expression avec les résultats de cette expression, et de ne pas modifier le fonctionnement de votre programme fonctionne." Il a les mêmes mises en garde, mais il exprime l'esprit de l'utilité de la "pureté" d'une façon plus positive.val x = 1
, et le type de l'expression est le type de fond. En d'autres termes, le pur opérateur d'affectation associe un identificateur non initialisée à une valeur.IO
monade est certainement impur, w.r.t. l'externeWorld
. Monadique de la composition est de la pure (sauf que dans ce cas où le compilateur Haskell est un "mensonge").IO
).IO
est "externe de main()", et donc laIO
utiliser dans le principal problème est la RT (c'est à dire pure), mais le programme d'ensemble qui est impur, car il contient de l'impur (c'est à dire non-RT) du code. Il existe 3 mots pour dire la même chose, impératif, non-RT, impur. 3 mots pour dire le contraire, déclarative, RT, pur."Pur" et "fonctionnelles" sont deux concepts distincts, bien que l'on n'est pas très utile sans l'autre.
Une pure expression est idempotent: elle peut être évaluée à un nombre quelconque de fois, avec des résultats identiques à chaque fois. Cela signifie que l'expression ne peut pas avoir toutes les observables d'effets secondaires. Par exemple, si une fonction muté à ses arguments, définir une variable quelque part, ou changé de comportement basée sur autre chose que son entrée à lui seul, alors que l'appel de fonction n'est pas pur.
Un langage de programmation fonctionnel est celui dans lequel les fonctions sont de première classe. En d'autres termes, vous pouvez manipuler des fonctions avec exactement la même facilité avec laquelle on peut manipuler toutes les autres valeurs de première classe. Par exemple, le fait de pouvoir utiliser une fonction "retour bool" comme une "structure de données représentant un ensemble" serait facile, dans un langage de programmation fonctionnel.
La programmation dans les langages de programmation fonctionnelle est souvent fait principalement de pur style, et il est difficile d'être strictement pur, sans fonction d'ordre supérieur manipulation activé par les langages de programmation fonctionnelle.
Haskell est un langage de programmation fonctionnel, dans lequel (presque) toutes les expressions sont de la pure; ainsi, Haskell est un langage de programmation purement fonctionnelle.
f(x): x + 1
est une simple fonction increment et "Pure", car il n'a pas d'effets secondaires ou de l'état. Attendu qu'il n'est pas idempotent parce quef(f(x)) != f(x)
. Tandis qu'une fonction commeg(x): x - x
est à la fois pure et idempotent. Parce qu'il renvoie toujours 0.Une fonction pure est une fonction qui n'a pas d'effets secondaires — il prend une valeur et donne une valeur de retour. Il n'y a pas d'état global que les fonctions de la modifier. Un langage purement fonctionnel est celle à laquelle les forces de fonctions pour être pur. La pureté a un certain nombre de conséquences, comme le fait que l'évaluation peut être différée depuis un appel de fonction n'a pas de but, mais pour renvoyer une valeur, alors vous n'avez pas besoin de réellement exécuter la fonction si vous n'allez pas utiliser sa valeur. Grâce à cela, des choses comme des fonctions récursives sur l'infinité des listes communes en Haskell.
Une autre conséquence est qu'il n'a pas d'importance dans quel ordre les fonctions sont évaluées puisqu'ils ne peuvent pas influencer les uns les autres, vous pouvez le faire dans n'importe quel ordre, qui est pratique. Cela signifie que certains des problèmes posés par la programmation parallèle n'existent tout simplement pas, car il n'y a pas un "mauvais" ou "droit" de commande pour les fonctions à exécuter.
À proprement parler, un pur langage fonctionnel est un langage fonctionnel (c'est à dire une langue où les fonctions sont des valeurs de première classe) où les expressions ont pas d'effets secondaires. Le terme “purement fonctionnelle de la langue” est synonyme.
Par cette définition, Haskell n'est pas un langage purement fonctionnel. Toute langue dans laquelle vous pouvez écrire des programmes qui affichent leur suite, lire et écrire des fichiers, avoir une interface graphique, et ainsi de suite, n'est pas purement fonctionnelle. Donc pas de langage de programmation purement fonctionnelle (mais il y a d'utile spécifiques au domaine purement fonctionnelle des langues: ils peuvent généralement être considéré comme intégré langues en quelque sorte).
Il est utile détendu sens dans lequel des langages comme Haskell et Erlang peut être considéré comme purement fonctionnel, mais les langues, comme le ML et le Régime ne peut pas. Une langue peut être considéré comme purement fonctionnelle si il est assez grand, d'utile et de bien caractérisés sous-ensemble des effets secondaires, où sont impossibles. Par exemple, en Haskell, tous les programmes dont le type n'est pas construit à partir de
IO
ou un autre effet-indiquant monade sont côté-effet-gratuit. En Erlang, tous les programmes qui n'utilisent pas de IO induisant des bibliothèques ou des fonctionnalités de simultanéité sont des effets secondaires sans (c'est plus d'étendue que le Haskell cas). À l'inverse, en ML ou un Schéma, un effet secondaire peut être enterré dans n'importe quelle fonction.Par ce point de vue, purement fonctionnelle sous-ensemble de Haskell peut être vu comme le langage intégré à traiter avec le comportement à l'intérieur de chaque monade (bien sûr, c'est une drôle de point de vue, comme presque tout le calcul qui se passe dans cette “embedded” sous-ensemble), et de l'aspect purement fonctionnel sous-ensemble d'Erlang peut être vu comme le langage intégré de régler comportement local.
Graham Hutton est un peu différent, et tout à fait intéressant, point de vue sur le sujet de la purement fonctionnelle des langues:
I. e. en Haskell, une fonction de type
a -> b
et ne peut pas avoir des effets secondaires. Une expression de typeIO (a -> b)
peut avoir des effets secondaires, mais ce n'est pas une fonction. Ainsi, en Haskell fonctions doit être pur, d'où Haskell est purement fonctionnelle.a -> IO b
, et, en effet, est une fonction qui retourne juste un IO enveloppé valeur.IO
pure (le compilateur est couché sur la pureté). Voir mes commentaires et des liens en vertu de Joel Spolsky de réponse.IO
est pur (ce qui serait assez stupide). Le compilateur n'est pas couché, sauf dans la mesure où vous considérez nonterminating programmes impur.IO
en Haskell est pur. Pourquoi êtes-vous en mentionnant "nonterminating"? Êtes-vous l'amalgame entre la page où j'ai écrit au sujet d'un type de fond? Semble que vous êtes confus quelque chose qui n'a rien à voir avec la logique, que je suis présente sur leIO
monade en Haskell. Veuillez expliquer.IO a
(le “immuable valeurs” que Paul se réfère), qui sont de la pure, de l'exécution de ces valeurs, ce qui est effectful (Paul “notionnel interprète”). Je mentionne nonterminating parce que, à strictement parler, nonterminating ne sont pas referentially transparent, depuis que le programme a un comportement différent si vous les évaluer au moins une fois ou pas du tout. Cela n'a rien à voir avec un type de fond; c'est très liée avec notamment un bas de la valeur à chaque type.IO
est inclus dans le programme. Le programme contient du code impératif, à cet effet, le programme n'est pas pur à 100%. Haskell se cache, mais il est toujours inclus dans le programme avant de l'exécuter. La même chose que si vous avez utilisé Scala et a écrit quelques-unes des parties purement et à d'autres parties sans RT. Je comprends très bien que tous les Haskell type inductif est rempli par le bas de la valeur, parce que la paresse langues fond est une valeur, et non pas un effet.Comme il ne peut y avoir d'effets secondaires du tout dans le plus pur du code fonctionnel, tests devient beaucoup plus facile, car il n'est pas extérieure de l'état de vérifier ou de vérifier. Aussi, de ce fait, l'extension de code peut devenir plus facile.
J'ai perdu le compte du nombre de fois que j'ai eu du mal avec les effets secondaires évidents lors de l'extension/la fixation (ou d'essayer de corriger le code.
Comme d'autres l'ont mentionné, le terme "pur" dans "pur langage de programmation fonctionnel" se réfère à l'absence d'observables effets secondaires. Pour moi, cela mène tout droit à la question:
Ce qui est un effet secondaire?
J'ai vu les effets secondaires explique à la fois comme
Si la première définition est la bonne, alors toute fonction qui effectue l'I/O (par exemple, l'écriture dans un fichier) ne peut pas être dit pour être un "pur" de la fonction. Alors que Haskell programmes peuvent appeler des fonctions qui cause I/O d'être exécuté, il semblerait que Haskell n'est pas un pur langage de programmation fonctionnel (comme il est prétendu être) selon cette définition.
Pour cela et d'autres raisons, je pense que la deuxième définition est la plus utile. Selon la deuxième définition, Haskell peut encore prétendre être complètement pur langage de programmation fonctionnel en raison des fonctions qui cause I/O pour être effectué de calcul des résultats basés uniquement sur la fonction des entrées. Comment Haskell concilie ces exigences apparemment contradictoires est très intéressant, je pense, mais je vais résister à la tentation de s'éloigner de tout loin de répondre à la question.
main
était une pure fonction d'un cours d'eau paresseux d'I/O, les réponses du monde dans un cours d'eau paresseux de demandes d'e/S pour le monde. Moderne Haskell utilise monades pour rendre cela plus facile à programmer, mais le concept est toujours le même: une pure valeur décrivant une transformation à appliquer à l'extérieur, impur monde.IO
monade avecST
, et votre programme devrait être pur et de ne pas savoir la différence.IO
avecST
monade en Haskell. Voir mes commentaires en vertu de Joel Spolsky de réponse et les liens de dans leur. Ici est la citation de l'un de la les documents que j'ai écrit, "L'état du Monde n'est pas réversible dans le temps, car il est impossible de mettre en cache l'infini d'états dans le Monde pour chaque temps discret (outre le temps est continu, ce qui est une autre raison, il existe d'infinies unis)...". Veuillez lire tous les points.World
, mais bien sûr, il ne pouvez pas le savoir, parce que c'est un coinductive type.World
, il ne peut pas garantir la RT. Faire une pure fonction qui litIO
et de l'écrit à l'écran. Appel de la fonction 2x, et observer que vous n'êtes pas assuré d'obtenir le même résultat. Avez-vous lu le lien j'ai donné? Je l'ai écrit, "impératif w.r.t. l'état du Monde externe au programme (mais dans le sens de la mise en garde ci-dessous, les effets secondaires sont isolés)".World
est la machine d'état du programme. Mais ce n'est isolé externe "à la main()" code impératif. Néanmoins, ce code fait partie du programme exécutable, ce qui rend le programme Haskell un mélange de pur et de l'impur code. Simplement, il ne peut pas en être autrement. Pas 100% pur programme peut interagir avec le COINDUCTIVE la réalité de notre univers. Savez-vous ce qu'est un coinductive type est?Amr Sabry a écrit un papier sur ce qu'est un langage purement fonctionnel est. Haskell est par cette définition, considérée comme pure, si l'on ignore des choses comme unsafePerformIO. En utilisant cette définition fait également ML et Erlang impur. Il y a des sous-ensembles de la plupart des langues considérées comme pures, mais personnellement, je ne pense pas qu'il soit utile de parler de C étant une langue pure.
Supérieur orderness est orthogonal à la pureté, vous pouvez concevoir un pur de premier ordre fonctionnel de la langue.