haskell - Monad 转换器 monad 重复

标签 haskell io monads monad-transformers maybe

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

最佳答案

使用lift (或 liftIO )而不是 liftM .

> :t val >>= lift . fn
val >>= lift . fn :: MaybeT IO [String]
liftM用于在 monad 中应用纯函数。 liftliftIO用于将 Action 提升到变压器中。
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

关于haskell - Monad 转换器 monad 重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637221/

相关文章:

haskell - 为什么 ghci 在这种情况下不提供预期的模糊类型变量错误?

haskell - 逐行读取文件

c# - 如何知道某个文件夹的文件是否正在被另一个进程使用?

haskell - 使用Operational Monad 实现的Writer 不会延迟工作

haskell - 为什么绑定(bind)运算符(>>=)按原样定义?

monads - PureScript FFI 和 Aff Monad : Why does the effect never run?

haskell - 黑线鳕 "could not find link destinations for"

haskell - 将 Kleisli 箭头提升到 IO?

java - 文件上传及读取

Haskell 的 groupBy 的 Scala 实现