Dans une interview avec John Hughes où il parle d'Erlang et Haskell, il a dit ce qui suit sur l'utilisation des bibliothèques avec état à Erlang:
Si je veux utiliser une bibliothèque avec état, je construis généralement une interface sans effet secondaire par-dessus pour pouvoir ensuite l'utiliser en toute sécurité dans le reste de mon code.
Que veut-il dire par là? J'essaie de penser à un exemple de ce à quoi cela ressemblerait, mais mon imagination et / ou mes connaissances me manquent.
Réponses:
(Je ne connais pas Erlang, et je ne peux pas écrire Haskell, mais je pense que je peux quand même répondre)
Eh bien, dans cette interview, l'exemple d'une bibliothèque de génération de nombres aléatoires est donné. Voici une interface avec état possible:
La sortie peut être
5 2 7
. Pour quelqu'un qui aime l'immuabilité, c'est tout simplement faux! Cela devrait l'être5 5 5
, car nous avons appelé la méthode sur le même objet.Alors, quelle serait une interface sans état? Nous pouvons voir la séquence de nombres aléatoires comme une liste évaluée paresseusement, où
next
récupère en fait la tête:Avec une telle interface, nous pouvons toujours revenir à un état précédent. Si deux morceaux de votre code font référence au même RNG, ils obtiendront en fait la même séquence de chiffres. Dans un état d'esprit fonctionnel, cela est hautement souhaitable.
L'implémenter dans un langage avec état n'est pas si compliqué. Par exemple:
Une fois que vous avez ajouté un peu de sucre syntaxique pour que cela ressemble à une liste, c'est en fait assez agréable.
la source
Un concept clé ici est celui de l'état mutable externe . Une bibliothèque qui n'a pas d'état mutable externe est une bibliothèque sans effets secondaires. Chaque fonction d'une telle bibliothèque ne dépend que des arguments qui lui sont passés.
Tests décisifs pratiques que j'utilise:
la source