みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellモナドトランスフォーマー(8)

次はリストトランスフォーマーを考えましょう。
Maybeトランスフォーマーのように、1つ引数をとるコンストラクタ付きのデータ型を定義します。

newtype ListT m a = ListT { runListT :: m [a] }

ListTモナドの実装も、もとのListモナドのそれと非常に似通っています。
Maybeのものと比べると内側のモナドに対する処理が少し増えていますが、基本的は同じで、モナドのサンドイッチ(ListT - m - List)をはがして新たに生成します。

List
instance Monad [] where
	b_v >>= f =
		let x = map f b_v
		in concat x
ListT
instance (Monad m) => Monad (ListT m) where
	tmb_v >>= f =
		ListT $ runListT tmb_v
			>>= \b_v -> mapM (runListT . f) b_v
				>>= \x -> return (concat x)