Stateモナドを考える(その5)
ついでなのでStateモナドの定義を最後まで.
MonadFixクラス
StateモナドはMonadFixクラスのインスタンスでもあります.Stateモナドから離れて,MonadFixクラスを考えてみます.何なんでしょう,これ.Fixというからには何かを固定するはずです.
class (Monad m) => MonadFix m where mfix :: (a -> m a) -> m a
MonadFixのインスタンスは以下の規則を満たすことが要請されています.
-- purity mfix (return . h) = return (fix h) -- left shrinking (or tightening) mfix (\x -> a >>= \y -> f x y) = a >>= \y -> mfix (\x -> f x y) -- sliding mfix (liftM h . f) = liftM h (mfix (f . h)), for strict h. -- nesting mfix (\x -> mfix (\y -> f x y)) = mfix (\x -> f x x)
・・・わからない・・上述の規則なんかは機械的に処理すれば検証可能なんでしょうが,その後ろにいるmdoとmfixの変換や,そもそもこれは何?というところで煮詰まりました.遅延パターンなんてのもでてくるし.
ということで,MonadFixそのものであろうmdo記法(再帰的do記法,μdo記法)の原典(の一つ)A recursive do for Haskell, by Levent Erk\"ok, John Launchbury, Haskell Workshop 2002, pages: 29-37. Pittsburgh, Pennsylvaniaを読んで考えます.しばしこの話は中断.