Applicative / Traversable を勉強する
>GHC 6.6 から(というか base-2.0から)入った Control.Applicative と Data.Traversable (と Data.Foldable) が何がなんだかさっぱりわからなかったので、
>リファレンス
>に挙げられている論文2編を読んでみた。
>
>いやーすごいわけがわからない。
>
>いや、読めば何が書いてあるかはわかるのだが、自分が活用できそうな気がしない。ともかく、まぁ、リストなどのデータコンテナとかモナドとかをジェネリックに操作するための手段であるということはわかったのだが、どういうときに便利になるものか、想像がつかない……。
>
>The Essence of the Iterator Pattern という J. Gibbons の論文の末尾では repmin 問題というのがあったのでこれを紹介したい。あるところに整数を要素とする二分木のデータがあって、すべてのノードのデータを、木全体のなかの最小値で置き換えなさいという問題。ただし制限があって、木全体のトラバースを1回しかやってはいけない。
>
>これを Traversable を駆使して解くのだが、最初はさっぱりわからなかった。コードはリンクを辿ってじかに論文を読んでほしいが、じっくり読んで、解きほぐしていくと理解できた。端的に言うとこういうことだ。ノードの各データは「最小値」にとにかく束縛しておくわけだが、この最小値は遅延評価されている、いわば計算の予約(サンク)になっている。で、ノードをたぐっていくとサンクの計算が進むように定義されている。逆に、最小値を計算しようとすると全要素をトラバースして最小値を計算するわけだけれども、同時に計算結果のノードもいっしょにメモリ上にマップされる。と書きくだしても禅問答だな。
>
>な……何を言っているかわからないと思うが俺も(最初は)わからなかった……。遅延評価とか型クラスとかそんなチャチなもんじゃねえ、もっと恐ろしいものの片鱗を味わったぜ……。
>
>という感じ。いや、なんかそんな大層な話ではないと思いますが。
>
>あと、実際の GHC 6.6 と、これらの論文ではいろいろ違いがあってけっこうしんどかった。 Monad は直接には Applicative ではないので(WrappedMonad が定義されるようだ)うまくないのだが、あるいは Data.Traversable のなかの定義を探るともっと便利な関数がいっぱいあるのかも。写経だけでそこは弄ってなかった。
>