純表達反覆評估我有(a)作出一些IO,(b)中構建的查找表,以及(c)將返回使用的查找表的IO動作的過程。但是,當與-O
編譯,GHC(6.12.1版本),內聯建設的查找表,從而將重新評估針對IO動作的每一個電話。在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
不反覆被分配?
您是否試過編譯指令`{ - #NOINLINE# - }`? – fuz 2011-02-06 12:41:11