質問

(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 繰り返し割り当てられていませんか?

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top