2012-02-14 48 views
3

是否存在一些智能延遲交互IO操作後出現的相互依賴純計算的路由?我正在閱讀兩個配置文件,第一個識別第二個配置文件,但第二個配置文件確定第一個配置文件的解釋。懶惰交織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 
    ... 

我很好奇,如果我能避免使procBaseConfigprocStateConfig,每個執行,直到它需要與其他信息相互遞歸編寫這個額外的功能procStateConfig'

特別是,我也許可以通過procBaseConfig f_state undefined更換procStateConfig'如果我無視一切取決於cfg_base的東西,但是這不工作這麼天真。

我想這可能會工作,如果我不需要記錄cfg_statecfg_base_fn元素爲第二BS.readFile,但目前看起來很難。而且我寧願折兩個BS.readFile調用進入proc.. cals。

回答

3

原則上,懶惰使它成爲可能。這裏的問題是,您需要根據第一個readFile的結果進行I/O操作。普通的Haskell不允許do-blocks中的遞歸綁定,但是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 s,它編譯。)

+0

如果你想,你可以通過重新使用'mfix'來避免'DoRec' – singpolyma 2012-11-21 20:09:42