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)