id:maoe:20091108:1257701870の件をhaskell-ja(chaton)で相談してみたところ、nwnさんとnobsunさんに教えていただきました。ありがとうございました。 せっかくなので、こちらにもまとめを書いておきます。 先のエントリで意図していた例 元々意図していたことは、putStrを2回するなんて恣意的なものではなく、 ログファイルの解析をするとき、1ファイル(あるいは生のログストリーム)から複数種類の解析を行いたい場合 頻出IPアドレスの提示とページビューの計算とユニークユーザ数の計算などを同時にしたい 遅延I/Oとメモリリーク - maoeのブログ というシチュエーションを想定していた。これに対して、スレッドを使うとか姑息な手段ではなく、かつ関数プログラミング的に美しい方法を教えてもらった。 解決策: 関数を融合してfoldl 上記の例では 頻出IPアド
Fun of Programming (Cornerstones of Computing)の3章「Origami programming」の冒頭にはこんな事が書かれている。 One style of functional programming is based purely on recursive equations. Such equations are easy to explain, and adequate for any computational purpose, but hard tu use well as programs get bigger and more complicated. In a sense, recursive equations are the 'assembly language' of functional programming, and
関数型言語というと「ループじゃなくて再帰」というイメージが強くて,実際自分も最初の頃はそう思い込んでいたけど, 実際には fold 等の高階関数を使うほうが多いよという話と,それに関連して foldl と foldr の違いの話. Prelude に様々なリスト操作関数が定義されてるが,その多くは fold さえあれば自分で再帰しなくても書ける. map f = foldr ((:) . f) [] (++) = flip (foldr (:)) filter f = foldr (\a b -> if f a then a:b else b) [] length = foldr (const (+1)) 0 reverse = foldl (flip (:)) [] and = foldr (&&) True or = foldr (||) False all f = foldr ((&
こないだの属性文法の記事では沢山 foldr が出てきます。foldr や foldl は関数型言語におけるループ構文です。私のようなにわか関数信者は嬉しがってつい再帰を使ってしまいますが、再帰のようなパターンを良しとしない本物の Haskell プログラマは fold を使います(多分)。ただ、foldr や foldl というネーミングは、文章が左から右へ流れると信じて疑わない欧米帝国主義の醜悪な悪習と言わないまでも、再帰についての重要な違いを軽視しているような印象を受けます。これらの関数は、本当は全然対称じゃないのです。というわけで調べてみます。 さて、足し算はどっちに結合しても良いので、1 + 2 + 3 + 4は次のように書けます。 foldr (+) 4 [1, 2, 3] -- 1 + (2 + (3 + 4)) == 10 foldl (+) 1 [2, 3, 4] --
1. リストを畳み込む foldl と foldr Haskell のサンプルコードを見ていると、よく見かける foldl と foldr 。名前からして両者は対照的な関数のようだ。 Prelude の List Operation の分類において、 Reducing lists (folds) として、わざわざ分類されているところを見ると、重要な関数なのだろう。 (@_@) そういえば、Reduce と言えば、Python の関数 reduce を思い出した。 Python のリスト内包表記 これと似たものなのかな? 2. どのように計算が行われるのか 「foldr と foldl の違い - 言語ゲーム」によると、foldr, foldl は、以下のように計算が行われる。 foldr (+) 4 [1, 2, 3] -- 1 + (2 + (3 + 4)) == 10 foldl (+
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く