【问题标题】:Monad transformers monad duplicationMonad 转换器 monad 重复
【发布时间】:2013-05-19 17:08:29
【问题描述】:
我是 monad 转换器的新手,很抱歉这个简单的问题。
我有价值val :: MaybeT IO String 和功能fn :: String -> IO [String]。
所以绑定后,我有val >>= liftM fn :: MaybeT IO (IO [String])。如何删除重复的 IO monad 并获得 MaybeT IO [String] 类型的结果?
【问题讨论】:
标签:
haskell
io
monads
monad-transformers
maybe
【解决方案1】:
使用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