Au risque de passer pour la réincarnation de Maître Capello, je me permets de rectifier quelques abus de langages.
Quand elle sera exécutée, elle produira un nombre entier aléatoire.
Plus précisément : quand sa valeur de retour sera évaluée, elle produira un nombre entier aléatoire.
Le problème avec unsafePerformIO, c'est qu'elle permet de tromper le compilateur. la fonction foo est considérée comme pure alors que pour tout x appartenant aux entiers, foo x /== foo x !
En conséquent, on a bien
x, y | x = y => foo x = foo y
Ce qu’on a pas par contre, c’est :
x, y | x = y => unsafePerformIO (foo x) = unsafePerformIO (foo y)
Voilà, ça ne change pas la validité de la réponse de Yo Eight, mais je trouve que ça permet de mieux voir ce que font les monades.
Partager