#@maoe 複数の処理を同時にこなせばよいような気がする。
#2つの処理を融合すればよいのでは。
#問題を単純化して行指向の解析を2つ行うとしましょう.基本的には畳み込みとおもわれるので
ana1 :: A1 -> Line -> A1
ana2 :: A2 -> Line -> A2
を仮定できて,
逐次処理で(メモリ上に全部読み込んで)よいなら
main = interact $ show . ((,) foldl' ana1 a1 <*> foldl' ana2 a2) . lines
融合処理するなら
main = interact $ show . foldl' (\ (a1,a2) c -> (ana1 a1 c, ana a2 c)) . lines
でよいと思われ.
#main = interact $ show . fold' (\ (a1,a2) -> (,) . ana1 a1 <*> ana2 a2) (a1,a2) . lines
#の間違い。orz
#nwnさんありがとうございます。想定しているのは、たとえばapacheのログからユニークユーザ数とページビュー数と頻出IPアドレス表を求める、みたいなものです。いずれの処理も頭から末尾までログを読まないと算出できません。
#なので、行をたたみ込む処理です。そういう意味ではnobsunさんの例が良さそうです。
#言われてみれば確かに融合できますね。上の例だとfoldl'の初期値が無くて動かないですが、参考にしてサンプルを書いてみました。
##みなさまどうもありがとうございました。
##コメント欄に Fold b は Applicative になるよーという指摘があります
#それで pageViews :: Fold Log Integer; uniqUsers :: Fold Log Integer ... みたいにして
#cfoldl' (Result <$> pageViews <*> uniqUsers <*> freqAddrs) . lines =<< readFile logfile
#おおおお!これはすごい。
#とか書いてみたらそれっぽくなるかなーと
##Applicative はもっと評価されるべき