Le System.IO docs contient une fonction mystérieuse non documentée fixIO
. Its source ne fait qu'ajouter au mystère:Que fait le fixIO?
fixIO :: (a -> IO a) -> IO a
fixIO k = do
m <- newEmptyMVar
ans <- unsafeInterleaveIO (takeMVar m)
result <- k ans
putMVar m result
return result
Cela semble faire l'équivalent moral de déréférencement NULL (lecture d'un MVar vide). En effet, l'essayer:
import System.IO
main = fixIO $ \x -> putStrLn x >> return x
provoque une erreur « thread bloqué indéfiniment dans une opération MVar »
Recherche se présente rien sauver un 15 year old message de Simon Peyton-Jones lui-même, dans lequel il fournit la source ci-dessus et espère que cela clarifiera le sens (et pourtant je suis ici).
Quelqu'un peut-il faire la lumière sur ce sujet? Qu'est-ce que fixIO fait et quand devrais-je l'utiliser?
'laissez fibs = 1: 1: zipWith (+) fibs (fibs de la queue) dans les fibs !! 9' fera aussi bien. –
Tom Ellis: Je suis sur mon téléphone mais je crois que la définition du correctif est 'fix f = let a = f a dans a', donc vous avez raison, ce n'est pas nécessaire. mais c'est équivalent. – rampion
Il peut aussi être plus succint: 'fix (1:)' est plus court que 'let x = 1: x dans x'. – rampion