関数型プログラミング言語Haskell Part20
■ このスレッドは過去ログ倉庫に格納されています
0316デフォルトの名無しさん
2012/11/08(木) 19:52:02.96遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。
import Control.Monad.Writer
tak :: Int -> Int -> Int -> Writer (Sum Int) Int
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
tak (fst(runWriter(tak (x - 1) y z)))
(fst(runWriter(tak (y - 1) z x)))
(fst(runWriter(tak (z - 1) x y)))
これで動くは動くんですが、引数を色々変えてもカウントが高々3でした。
少し考えてみて、再帰で呼んだ結果のカウントを捨ててるせいだろうというのは分かったのですが
改善策が思いつきません。上手い書き方があったら教えてもらえないでしょうか。
また、もしWriterでカウントするのが無理だとしたらどうするのが定石でしょうか?
■ このスレッドは過去ログ倉庫に格納されています