11
votes

Modèle le plus courant d'utilisation d'une base de données dans une langue fonctionnelle, étant donné aucun effets secondaires?


0 commentaires

3 Réponses :


11
votes

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 principal code> la fonction soit une action qui peut être couru. P>

Essayer d'expliquer cela avec pseudocode, voici un programme dans un impératif impératif fort>, non fonctionnel Strong> Langue: P>

main = do
  mystring <- readFile "abc.txt"
  writeFile "def.txt" mystring


0 commentaires

6
votes

Le modèle le plus courant pour faire face aux effets secondaires et à l'impureté des langues fonctionnelles est la suivante:

  • être pragmatique, pas puriste
  • Fournir des intégrés qui permettent un code impur et des effets secondaires
  • les utiliser aussi peu que possible!

    Exemples:

    • lisp / schéma: SET!
    • Clojure: Refs et utilise des méthodes de mutation sur les objets Java
    • SCALA: Création de variables avec var
    • ml: pas sûr de spécificités, mais Wikipedia dit qu'il permet une impureté

      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 , y compris l'état de Le système de fichiers / db sera transmis à la fonction. (1) Ainsi, si vous pouvez reproduire l'état de l'univers entier à l'instant , 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 , et ainsi les fonctions renvoient des valeurs différentes ...

      Mais la solution de Haskell, IMHO, n'est pas la plus courante.


      (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.


2 commentaires

Pour ce que ça vaut la peine, ce n'est pas la façon dont les choses travaillent à 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.



4
votes

Acessing Une base de données n'est pas différente des autres cas de sortie d'entrée, tels que impression (17) .

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.

in Haskell, la solution pour le problème de l'IO utilise des monades. Par exemple, si vous vérifiez HDBC , une bibliothèque de bases de données HASKELLL, vous pouvez voir beaucoup de fonctions là-bas de retour d'actions IO.

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.


0 commentaires