Stateモナドを考える(その3)

Stateモナドモナドであることの定義は以下の通りです.

-- Monadクラスとクラスメソッド
class  Monad m  where
 (>>=)       :: forall a b. m a -> (a -> m b) -> m b
 return      :: a -> m a

-- State sをMonadクラスのインスタンスにする
instance Monad (State s) where
    return a = State $ \s -> (a, s)
    m >>= k  = State $ \s -> let
        (a, s') = runState m s
        in runState (k a) s'

-- Monad則
return a >>= k  ==  k a
m >>= return  ==  m
m >>= (\x -> k x >>= h)  ==  (m >>= k) >>= h

-- State sはFunctorなので更にfmapと(>>=)の規則
fmap f m  ==  m >>= return . f

モナド則とfmapの規則をチェックするわけですが,ここでトリック(というほどでもないかもしれません)が一つあります.mとnをState s aの値だとして,

m = n == runState m = runState n
m = State $ runState m  

だということです.