J'essaie d'obtenir ma tête autour d'un concept de base de languards fonctionnels: p>
"Un concept central en langues fonctionnelles est que le résultat d'une fonction est déterminé par son entrée, et uniquement par son entrée. Il n'y a pas d'effets secondaires!" P>
3 Réponses :
Juste parce qu'une langue fonctionnelle est fonctionnelle (peut-être même complètement pure comme Haskell!), cela ne signifie pas que les programmes écrits dans cette langue doivent être pure lorsque l'approche de Haskell, par exemple, lorsqu'il s'agit d'un côté -effecte, peut-on expliquer plutôt simplement: laissez l'ensemble du programme lui-même pur (ce qui signifie que les fonctions renvoient toujours les mêmes valeurs pour les mêmes arguments et n'ont aucun effet secondaire), mais laissez la valeur de retour du Essayer d'expliquer cela avec pseudocode, voici un programme dans un impératif impératif fort>, principal code> la fonction soit une action qui peut être couru. P>
main = do
mystring <- readFile "abc.txt"
writeFile "def.txt" mystring
Le modèle le plus courant pour faire face aux effets secondaires et à l'impureté des langues fonctionnelles est la suivante: p>
Exemples: P>
SET! CODE> LI>
- Clojure: Refs et utilise des méthodes de mutation sur les objets Java Li>
- SCALA: Création de variables avec
var code> li>
- ml: pas sûr de spécificités, mais Wikipedia dit qu'il permet une impureté li>
ul>
Haskell trompe un peu - sa solution est que, pour les fonctions qui accèdent au système de fichiers ou la base de données, l'état de l'univers entier à l'instant strong>, y compris l'état de Le système de fichiers / db em> sera transmis à la fonction. (1) Ainsi, si vous pouvez reproduire l'état de l'univers entier à l'instant fort>, vous pouvez obtenir les mêmes résultats deux fois d'une telle fonction. Bien sûr, vous ne pouvez pas reproduire l'état de l'univers entier à l'instant strong>, et ainsi les fonctions renvoient des valeurs différentes ... P>
Mais la solution de Haskell, IMHO, n'est pas la plus courante. P>
(1) pas sûr des détails ici. Merci à Camccann d'avoir souligné que cette métaphore est surutilisée et peut-être pas tout cela précis. Em> p>
Pour ce que ça vaut la peine, ce n'est pas la façon dont les choses travaillent i> à Haskell, cependant c'est une métaphore couramment utilisée. Tout ce qui se passe réellement est que le système de type est utilisé pour que les fonctions impurées soient marquées comme telles et exécutées dans un ordre bien défini. La métaphore de «passage de l'état de l'univers» est utilisée dans la mise en œuvre de cela, mais conceptuellement, cela ne tient pas bien sous inspection étroite.
Univers signifie qu'il semble plus difficile que ce soit, pour son contexte qui est un dB. C'est tout à fait possible, et si vous utilisez l'approvisionnement des événements, vous pouvez également obtenir l'état dans le passé. Ressources intensives, mais nous parlons fonctionnels ici.
Acessing Une base de données n'est pas différente des autres cas de sortie d'entrée, tels que Dans les langues évaluées avec impatience, comme Lisp et ml L'approche habituelle de la programmation effective utilise simplement des effets secondaires, comme dans la plupart des autres langages de programmation. P>
in Haskell, la solution pour le problème de l'IO utilise des monades. Par exemple, si vous vérifiez HDBC A>, une bibliothèque de bases de données HASKELLL, vous pouvez voir beaucoup de fonctions là-bas de retour d'actions IO. P>
Certaines langues, comme propre, utilisez des types d'unicité pour appliquer le même type de séquentialité haskell avec les monades, mais ces langues sont plus difficiles à trouver aujourd'hui. P> impression (17) code>. P>