是否有一些方法可以使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_fnBS.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/

10-09 15:53