我有一个过程,(a)执行一些 IO,(b)构造一个查找表,(c)返回一个使用查找表的 IO 操作。但是当使用 编译时-O
,GHC(版本 6.12.1)内联构造查找表,以便每次调用 IO 操作时都会重新评估它。
例子:
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
这个问题是否广为人知,可以有一个标准的 GHC 万无一失的解决方法 - 或者您将如何调整程序以便a
不会重复分配?