相关疑难解决方法(0)

在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
Run Code Online (Sandbox Code Playgroud)

这个问题是众所周知的,有足够的标准GHC万无一失的解决方法 …

io closures haskell inlining ghc

5
推荐指数
1
解决办法
333
查看次数

标签 统计

closures ×1

ghc ×1

haskell ×1

inlining ×1

io ×1