2012-02-14 9 views
3

IO操作後に発生する相互に依存する純粋な計算をインテリジェントに遅延インターリーブするルートがありますか?私は2つの設定ファイルを読んでいます。最初のファイルは2番目のファイルですが、2番目のファイルは最初のファイルの解釈を決定します。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'を書いて避けることができれば、私は興味があります。

cfg_baseに依存するすべてのものを無視すると、特にprocStateConfig'procBaseConfig f_state undefinedに置き換えることができますが、これはあまりうっとりすることはありません。

私がレコードcfg_statecfg_base_fnの要素が2番目のBS.readFileの要素を必要としない場合、これはうまくいくかもしれないと思っていますが、現在は見苦しくなります。とにかくproc..のコールにはBS.readFileコールを両方とも折り畳むことにします。

答えて

3

原則として、怠惰が可能になります。ここでの問題は、最初のreadFileの結果に基づいてI/Oを行う必要があることです。普通のHaskellはdo-blockで再帰的なバインディングを許可していませんが、GHCの拡張子はDoRecです。私はそれを使用したことがないので、いくつかの間違いをするかもしれませんが、

それを行う必要があります。 (少なくとも、いくつかのダミーを埋めるとundefinedがコンパイルされます)

+0

もしあなたが望むのであれば、 'mfix'を使って' DoRec'を再フォーマットすることで回避できます。 – singpolyma

関連する問題