haskell-ja > Archives > 2009/11/10

2009/11/10 09:14:33 UTCnobsun
#
@maoe 複数の処理を同時にこなせばよいような気がする。
2009/11/10 09:43:27 UTCnobsun
#
2つの処理を融合すればよいのでは。
2009/11/10 09:57:43 UTCnobsun
#
問題を単純化して行指向の解析を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
でよいと思われ.
2009/11/10 11:00:18 UTCnobsun
#
main = interact $ show . fold' (\ (a1,a2) -> (,) . ana1 a1 <*> ana2 a2) (a1,a2) . lines
#
の間違い。orz
2009/11/10 14:15:40 UTCmaoe
#
nwnさんありがとうございます。想定しているのは、たとえばapacheのログからユニークユーザ数とページビュー数と頻出IPアドレス表を求める、みたいなものです。いずれの処理も頭から末尾までログを読まないと算出できません。
#
なので、行をたたみ込む処理です。そういう意味ではnobsunさんの例が良さそうです。
#
言われてみれば確かに融合できますね。上の例だとfoldl'の初期値が無くて動かないですが、参考にしてサンプルを書いてみました。
#
http://gist.github.com/230903
2009/11/10 14:26:20 UTCmaoe
#
みなさまどうもありがとうございました。
2009/11/10 14:27:51 UTCnwn
#
この辺りも参考になるんではないかと思います。left-fold を組み合わせて複雑な関数を作る: http://squing.blogspot.com/2008/11/beautiful-folding.html
#
コメント欄に Fold b は Applicative になるよーという指摘があります
#
それで pageViews :: Fold Log Integer; uniqUsers :: Fold Log Integer ... みたいにして
#
cfoldl' (Result <$> pageViews <*> uniqUsers <*> freqAddrs) . lines =<< readFile logfile
2009/11/10 14:33:59 UTCmaoe
#
おおおお!これはすごい。
2009/11/10 14:34:02 UTCnwn
#
とか書いてみたらそれっぽくなるかなーと
#
こなちゃんの反応: http://conal.net/blog/tag/zip/
#
Applicative はもっと評価されるべき