昨日のモナドトランスフォーマーの勉強中に使ったliftIOですが、勘違いをしていたことにやっと気がつきました。liftIOの型情報は liftIO :: IO a -> m a と、この関数だけ見るとIOアクションをほかのどんな形のモナドにでも挿げ替えてくれるハッキーな関数のようにしか見えなかったのですが、もうちょっと周りを見ると、実は、このliftIOはMonadIOというクラスのメソッドなんですね。そして、このクラスのインスタンス宣言のほうにも大切な情報が隠れていました。 class Monad m => MonadIO m where liftIO :: IO a -> m a Instances MonadIO IO MonadIO m => MonadIO (ListT m) MonadIO m => MonadIO (ContT r m) (Error e, MonadIO m