みどりねこ日記

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

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

モナドトランスフォーマーによって合成されたモナドを使うとき、内側のモナドをきちんと考える必要がないようにしたいところです。そのほうが綺麗でシンプルなコードになるからです。内側のモナドの型を持った値を扱う計算の中でdoブロックを使うより、内側のモナドを合成モナドまで持ち上げる命令を使ったほうが良いでしょう。

liftMは、モナディックでない関数をモナドに持ち上げる関数だったことを思い出してください。各モナドトランスフォーマーはモナディックな計算を合成モナドに持ち上げる関数liftを用意しています。

MonadTransクラスはControl.Monad.Transの中で定義されており、liftという関数1つだけを提供します。

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

IO処理を持ち上げるために最適化されたモナドはMonadIOクラスのメンバーとして定義されており、関数liftIOと名付けられています。

class (Monad m) => MonadIO m where
	liftIO :: IO a -> m a