関数型プログラミング言語Haskell Part18
■ このスレッドは過去ログ倉庫に格納されています
0195デフォルトの名無しさん
2012/04/27(金) 18:02:32.57fib n = fib (n-1) + fib (n-2)
のところを
fib n = let
n1 = fib (n -1)
n2 = fib (n - 2)
in (n1 + n2)
と書いて、モナド形式に変換した〜と言ってる2番目の例と比較してみればわかるんじゃないかな。
do が let、<-が=、returnが(大体)inに対応していると思って。
(これは他のどのモナドでも同じ。do文はモナドによって特殊な振る舞いを組み込む事の出来るlet式。
MonadFixのインスタンスにしてDoRec言語拡張でrecキーワードを有効にしないと再帰束縛はできんけど。)
関数を呼び出す際に、1引数関数(k -> Memo k v)と、値kを取る、memoって関数を介して呼び出すと、kに対する計算結果をメモ化してくれる。
これは、適用演算子($) :: (k -> v) -> k -> vにメモ化機能付けたもの、と考えてもおkだと思う。
異なる関数で相互再帰したりする場合はそれぞれ違うメモモナドを使わないとダメっぽいので、モナド変換子を理解してないとちょっとむずいかも。
■ このスレッドは過去ログ倉庫に格納されています