gpt4 book ai didi

haskell - IO 操作中纯表达式的重复求值

转载 作者:行者123 更新时间:2023-12-03 02:15:59 25 4
gpt4 key购买 nike

我有一个过程,(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 不会被重复分配?

最佳答案

最简单的解决方法是使用严格注释强制评估。

{-# LANGUAGE BangPatterns #-}

然后通过简单地使用 ! (“bang”)使 a 严格化来强制分配。

    let !a = listArray (0, 1000) [x ..]

或者,如果您使用 IO monad,严格注释可能并不总是有帮助。要在运行某些 IO 操作之前强制计算表达式,您可以使用 evaluate 。例如:

    let a = listArray (0, 1000) [x ..]
evaluate a

关于haskell - IO 操作中纯表达式的重复求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com