LoginSignup
1
0

More than 5 years have passed since last update.

MonadTrans型クラス

Posted at

いわゆるモナド変換子。定義はこんなの。

class MonadTrans t where
    lift :: Monad m => m a -> t m a

以下の法則を満たす。

lift . return = return
lift (m >>= f) = lift m >>= (lift . f)

今まではなんとなくモナドの分配則で語るべき話かと思ってたんだけど、微妙に違うっぽい。具体的には、liftはモナド間の射(monad morphism)として定義されている。確かに、求められる法則を見るとreturn(>>=)の構造を保持するような規則と読み取れる。

ところで、モナドは関手なので、その間の射であれば自然変換であるべきだ。liftも計算してみるときちんと自然変換になっている。f :: a -> bについて可換性を見てみる。

(lift . (fmap f)) mx
 = lift(fmap f mx)
 = lift(mx >>= (return . f)) -- fmapの定義
 = lift mx >>= (lift . return . f) -- 法則2
 = lift mx >>= (return . f) -- 法則1
 = fmap f (lift mx) -- fmapの定義
= ((fmap f) . lift) mx

きちんと可換になっている。fmapreturnが型が違うのに同じ表記になるのが見づらいが、要はξ_b ∘ Mf = Tf ∘ ξ_aを示したことになる(ただし、Monad mはM、Monad (t m)はT、liftはξで表記)。

とここまで書いて、Monad (t m) は定義に入ってないことに気がついた。return :: a -> t m aとかを暗黙に期待しているから、別に要らないだろってことでいいのかな。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0