Question

J'ai une procédure qui (a) fait un IO, (b) construit une table de recherche, et (c) renvoie une action IO qui utilise la table de recherche. Mais lorsqu'il est compilé avec -O, GHC (version 6.12.1) Inlite la construction de la table de recherche, afin qu'elle soit réévaluée pour chaque appel de l'action IO.

Exemple:

module Main where
import Data.Array
import Data.IORef
import Control.Monad

makeAction getX getY sumRef = do
    x <- getX
    let a = listArray (0, 1000) [x ..]
    return $ do
        y <- getY
        modifyIORef sumRef (\sum -> sum + a ! y)

main = do
    sumRef <- newIORef 0
    action <- makeAction getX getY sumRef
    replicateM_ 100000 action
    n <- readIORef sumRef
    putStrLn (show n)
    where
    getX = return (1 :: Int)
    getY = return 0

Ce problème est-il suffisamment connu pour avoir une solution de contournement standard pour les bouts de GHC - ou comment ajusteriez-vous le programme afin que a n'est-il pas attribué à plusieurs reprises?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top