单子变换器:单子复制问题

10

我刚接触Monad Transformer,抱歉问一个简单的问题。 我有一个值val :: MaybeT IO String和一个函数fn :: String -> IO [String]。 所以在绑定后,我有 val >>= liftM fn :: MaybeT IO (IO [String])。如何去掉重复的IO Monad并获取类型为MaybeT IO [String]的结果?

1个回答

13

使用lift(或liftIO)代替liftM

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

liftM 是用于在单子中应用纯函数的。而liftliftIO 则是将动作提升到变换器中使用。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接