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)))