- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下来自互联网的代码片段:
calculateLength :: LengthMonad Int
calculateLength = do
-- all the IO operations have to be lifted to the IO monad in the monad stack
liftIO $ putStrLn "Please enter a non-empty string: "
s <- liftIO getLine
if null s
then throwError "The string was empty!"
else return $ length s
liftIO
?
liftIO
的目的是什么?
class (Monad m) => MonadIO m where
-- | Lift a computation from the 'IO' monad.
liftIO :: IO a -> m a
IO a -> [a]
?它看起来像自然的转变。
最佳答案
IO
像 getLine, putStrLn "..."
这样的操作只能在 IO
内工作单子(monad)。在任何其他 monad 中使用它们会触发类型错误。
尽管如此,还是有很多单子(monad) M
根据 IO
定义(例如 StateT Int IO
,显然你的 LengthMonad
也是如此),因此他们允许 IO
要转换为 M
的操作-actions,并照此执行。
但是,我们需要对每个 M
进行转换。 :
convertIOintoM1 :: IO a -> M1 a
convertIOintoM2 :: IO a -> M2 a
convertIOintoM3 :: IO a -> M3 a
...
MonadIO
有这样的转换功能,所以上面的所有功能都可以命名为
liftIO
反而。
liftIO
每次想要运行时使用
IO
另一个 monad 中的 Action ,只要这样的 monad 允许。
关于haskell - LiftIO 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58366794/
我有以下来自互联网的代码片段: calculateLength :: LengthMonad Int calculateLength = do -- all the IO operations h
我正在编写一个越来越大的管道,其中包含嵌套的 monad 转换。将每个 yield 或 await 调用lift 调用到基础 conduitM 中是一项繁琐的工作。更不用说每次我添加或撤消一层转换时,
在什么情况下应该使用liftIO?当我使用 ErrorT String IO 时,lift 函数会将 IO 操作提升到 ErrorT 中,因此 liftIO看来是多余的。 最佳答案 lift 始终从“
您好社区,感谢您抽出宝贵时间。 我有一个错误,我不确定错误是什么,但我认为问题是:ext-1.2.4.1:Data.Text.Internal.Lazy.Text IO)没有IO变压器至 Web.Sc
我先说我是一个新手 Haskell 程序员(这些年来偶尔会修改它)但是当谈到 OOO 和命令式编程时,我有几年的时间。我目前正在学习如何使用 monad 并通过使用 monad 转换器将它们组合起来(
我正在尝试获取一些在 ghc 7.0.4 和 7.4.1 中工作的代码。 在我看来,从 Snap mo 内部访问 IO 的旧方法不再进行类型检查。 在 ghc 7.0.4 中,记录了访问 IO 的方式
我是一名优秀的程序员,十分优秀!