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を読んで考えます.しばしこの話は中断.