(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
繰り返し割り当てられないようにプログラムをどのように調整しますか?