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
scroll top