是否有一些方法可以使IO操作之后出现的相互依存的纯计算智能地延迟交织?我正在读取两个配置文件,第一个标识第二个,但是第二个确定对第一个的解释。
import qualified Data.ByteString.Char8 as BS
main = do
...
f_state <- BS.readFile fn_state
let cfg_state' = procStateConfig' f_state
f_base <- BS.readFile $ cfg_base_fn cfg_state'
let cfg_base = procBaseConfig f_base
let cfg_state = procStateConfig f_state cfg_base
...
我很好奇是否可以通过使
procStateConfig'
和procBaseConfig
相互递归来避免编写此额外的函数procStateConfig
,因为它们相互执行直到需要对方的信息为止。特别是,如果我忽略了所有依赖
procStateConfig'
的内容,也许可以用procBaseConfig f_state undefined
替换cfg_base
,但这并不是那么天真。我想如果我不需要第二个
cfg_state
的记录cfg_base_fn
的BS.readFile
元素,这可能会起作用,但是目前看来很难。而且我还是希望将两个BS.readFile
调用都折叠到proc..
校准中。 最佳答案
原则上,懒惰使之成为可能。这里的问题是您需要根据第一个readFile
的结果进行I / O。普通的Haskell不允许在do-block中进行递归绑定,但是GHC扩展DoRec
允许。我从未使用过它,所以我可能会犯一些错误,但是
{-# LANGUAGE DoRec #-}
module Main where
import qualified Data.ByteString.Char8 as BS
main = do
...
{ f_state <- BS.readFile fn_state
; rec { let cfg_state = procStateConfig f_state cfg_base
; cfg_base <- fmap procBaseConfig $ BS.readFile $ cfg_base_fn cfg_state
}
; ...
}
应该这样做。 (至少填充一些伪
undefined
,它会编译。)关于haskell - 懒惰地交错包含在IO monad中的纯计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9285596/