10

我是 monad 转换器的新手,所以很抱歉这个简单的问题。我有价值val :: MaybeT IO String和功能fn :: String -> IO [String]。所以绑定后,我有val >>= liftM fn :: MaybeT IO (IO [String]). 如何删除重复的 IO monad 并获得类型的结果MaybeT IO [String]

4

1 回答 1

13

使用lift(或liftIO)代替liftM

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

liftM用于在 monad 中应用纯函数。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
于 2013-05-19T17:22:48.777 回答