Le post de Sylvain Henry explique bien pourquoi justement cette IO n’a pas de type caché et est bien pure. La fonction randomIO retourne une IO qui n’est pas la valeur du nombre aléatoire, mais une monade qui indique comment obtenir une valeur. Mais ce comment reste toujours le même quelque soit le nombre de fois que tu appelles foo ou randomIO.
On peut voir ce comment en action en n’appellant qu’une seule fois randomIO, afin d’obtenir une seule valeur de retour (de type IO double par exemple), et en l’invoquant plusieurs fois.
ghci> import System.Random
ghci> let f = randomIO :: IO Double
ghci> f
9.246329697709554e-3
ghci> f
0.954075333075334
On peut faire de même avec ta fonction foo, ne l’appeller qu’une seule fois, et se servir de la monade retournée pour obtenir plusieurs valeurs. IO ne fournit qu’une méthode pour accéder au monde, mais ne modifie pas le monde en elle même.
[^] # Re: cat troll.hs
Posté par neil . En réponse à la dépêche Sortie du Glorious Haskell Compiler 7.8. Évalué à 4. Dernière modification le 16 avril 2014 à 01:47.
Le post de Sylvain Henry explique bien pourquoi justement cette IO n’a pas de type caché et est bien pure. La fonction
randomIOretourne uneIOqui n’est pas la valeur du nombre aléatoire, mais une monade qui indique comment obtenir une valeur. Mais ce comment reste toujours le même quelque soit le nombre de fois que tu appellesfooourandomIO.On peut voir ce comment en action en n’appellant qu’une seule fois
randomIO, afin d’obtenir une seule valeur de retour (de typeIO doublepar exemple), et en l’invoquant plusieurs fois.On peut faire de même avec ta fonction
foo, ne l’appeller qu’une seule fois, et se servir de la monade retournée pour obtenir plusieurs valeurs.IOne fournit qu’une méthode pour accéder au monde, mais ne modifie pas le monde en elle même.Le tout est expliqué et formalisé par l’auteur du langage, Simon Peyton Jones, dans son célèbre Tackling the awkward squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell.