Evaluación repetida de la expresión pura en la acción IO
Pregunta
Tengo un procedimiento que (a) hace algunos IO, (b) construye una tabla de búsqueda y (c) devuelve una acción IO que usa la tabla de búsqueda. Pero cuando se compila con -O
, GHC (Versión 6.12.1) Inline la construcción de la tabla de búsqueda, de modo que se reevalúe para cada llamada de la acción IO.
Ejemplo:
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
¿Es este problema lo suficientemente conocido como para tener una solución estándar de GHC, o cómo ajustar el programa para que a
¿No se está asignando repetidamente?
No hay solución correcta
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow