質問です。Writerモナドというものを知ったので、前から知りたかった
遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。

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でカウントするのが無理だとしたらどうするのが定石でしょうか?