IOアクションにおける純粋な表現の繰り返し評価
質問
(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
繰り返し割り当てられていませんか?
正しい解決策はありません
所属していません StackOverflow