Valutazione ripetuta dell'espressione pura nell'azione IO
Domanda
Ho una procedura che (a) esegue alcuni IO, (b) costruisce una tabella di ricerca e (c) restituisce un'azione IO che utilizza la tabella di ricerca.Ma quando compilato con -O
, GHC (versione 6.12.1) integra la costruzione della tabella di ricerca, in modo che venga rivalutata per ogni chiamata dell'azione IO.
Esempio:
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
Questo problema è abbastanza noto per avere una soluzione alternativa standard GHC infallibile o come adatteresti il programma in modo che a
non viene assegnato ripetutamente?
Nessuna soluzione corretta
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow