2013-05-19 20 views
10

私はモナド変圧器を初めて使用しています。 私は値val :: MaybeT IO Stringと機能fn :: String -> IO [String]を持っています。 バインド後、私はval >>= liftM fn :: MaybeT IO (IO [String])を持っています。重複するIOモナドを削除し、タイプMaybeT IO [String]の結果を得るにはどうすればよいですか?モナド変圧器モナドの複製

答えて

13

liftMの代わりにlift(またはliftIO)を使用してください。

> :t val >>= lift . fn 
val >>= lift . fn :: MaybeT IO [String] 

liftMは、モナドの純関数を適用するためのものです。 liftおよびliftIOは、アクションをトランスフォーマーに持ち上げるためのものです。

liftM :: Monad m => (a -> b) -> m a -> m b 
lift :: (Monad m, MonadTrans t) => m a -> t m a 
liftIO :: MonadIO m => IO a -> m a 
関連する問題