• [^] # Re: cat troll.hs

    Posté par . En réponse à la dépêche Sortie du Glorious Haskell Compiler 7.8. Évalué à 2.

    Une valeur de type IO a n'est pas une valeur «marquée impure», mais une action non pure produisant une valeur de type a. En théorie, IO n'est pas un conteneur contenant une valeur de type a. La notion de foncteur, et par extension de monade, est plus générale que celle de conteneur.

    C'est seulement lorsque cette action est exécutée dans le main ou l'invite de ghci que la valeur aléatoire est générée. Dans le reste du programme, il n'y a que des fonctions pures qui combinent des actions monadiques avec >>= pour assembler l'action non pure IO () du main.

    En pratique, (mais cela importe peu) cela est implémentée avec un passage de bâton RealWorld, comme l'a montré Sylvain Henry. Il est également possible d’altérer cette mécanique cachée avec des fonctions comme unsafePerformIO :: IO a -> a. Mais comme son nom l'indique, elle peut potentiellement supprimer les garanties de la transparence référentielle.