「モナド則再び」で書いた「モナド則1」は何の訳に立つのかという問題ですが、"Monads for functional programming" に答えが載っていました。 以下のような加算機を考えます。 data Term = Con Int | Add Term Term data M a = M a deriving Show instance Monad M where return x = M x M x >>= f = f x eval :: Term -> M Int eval (Con a) = return a eval (Add t u) = do a <- eval t b <- eval u return (a + b) 論文には、M の実装が載っていないので、適当に作りました。Maybe でもいいでしょう。 こういう風に動きます。 式1: eval (Add (Co