- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想我缺少对 monad 转换器的一些基本了解,因为我发现自己编写了以下代码:
import Control.Monad.Identity
import Control.Monad.Error
liftError :: Either String Int -> ErrorT String Identity Int
liftError x = do case x of
Right val -> return val
Left err -> throwError err
gateway :: Bool -> ErrorT String Identity Int
gateway = liftError . inner
inner :: Bool -> Either String Int
inner True = return 5
inner False = throwError "test"
liftError
的替代品,我认为我不应该为自己定义。
gateway
的最直接方法是什么?和
inner
一起工作而不改变他们的类型?
最佳答案
如果你只是稍微改变一下类型,你根本不需要做任何提升。
{-# LANGUAGE FlexibleContexts #-}
gateway :: Bool -> ErrorT String Identity Int
gateway = inner
inner :: MonadError String m => Bool -> m Int
inner True = return 5
inner False = throwError "test"
MonadError
有两个实例
ErrorT
和
Either
,这样你就可以使用
inner
既。
关于haskell - 将错误值提升到 ErrorT monad 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016677/
运行类型为 t (ErrorT String IO) a 的代码的最佳方式是什么?来自 t IO a单子(monad)?考虑下面的代码: module Sample where import Syst
是否可以在 ErrorT monad 中累积错误消息?我想积累更多的错误。 最佳答案 您可以使用Control.Applicative.Lift中的Errors应用程序来自变形金刚: ghci> im
我想我缺少对 monad 转换器的一些基本了解,因为我发现自己编写了以下代码: import Control.Monad.Identity import Control.Monad.Error lif
假设我有这两个功能: errorm :: ( MonadError String m ) => Bool -> m Int errorm cond = if cond then return 1 e
最近的 cabal 安装升级了我的 transformers 版本来自0.3.0.0至 0.4.1.0 。此次升级带来了有关 ErrorT 的折旧警告。 文档不清楚这只是重命名还是有功能更改?为什么要
假设我有这两个功能: errorm :: ( MonadError String m ) => Bool -> m Int errorm cond = if cond then return 1 e
我在程序中的不同级别有两个控制结构的类型声明。最底层是Agent,它是一个具有IO 功能的StateT。第二个是另一个具有 Agent 功能的 StateT,第三个 (Plan) 是一个 ErrorT
我想定义一个 monad 转换器,除其他外,它赋予基本 monad 错误功能。如果基本 monad 是的话,转换后的 monad 应该是 MonadPlus 的一个实例,但我不知道如何定义 Monad
我是一名优秀的程序员,十分优秀!