Stateモナドを考える(その3)
-- 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
だということです.