Haskell monads 和不需要字符串的失败

标签 haskell monads monad-transformers

我有以下用于处理 Haskell 错误的 monad 转换器。

instance (Monad m, Error e) => Monad (EitherT e m) where
    return = EitherT . return . return
    m >>= k  = EitherT $ do
            a <- runEitherT m
            case a of
                Left  l -> return (Left l)
                Right r -> runEitherT (k r)
    fail = EitherT . return . Left . strMsg

它工作得很好,因为我可以实例化 Error使用自定义类,并具有非常灵活的方法来处理错误。
fail不过有点傻,因为它是类型 String -> EitherT e m ,以及 String限制可能是一种令人讨厌的产生错误的方式。我最终得到了很多:
instance Error BazError where
    strMsg "foo" = FooError -- oh look we have no error context
    strMsg "bar" = BarError -- isn't that nice

我想做的是创建一个新函数,比如 fail ,即类型 a -> e这样我就可以删除 (Error e)限制。 fail当 monad 堆栈变大时特别方便,比如当我结束时
EitherT BazError (StateT [BazWarning] IO) Foo

有没有办法创建一个与 fail 具有相同行为的函数?限制较少的类型?或者是 fail使用 deep haskell 黑魔法实现?

最佳答案

那么,fail如果您在 do 块中遇到模式匹配失败,则会调用它,就像您有 Just x <- something 一样和 something的结果是 Nothing .除此之外,fail是一个普通的函数。

对于 strMsg "foo" = FooError 的问题等等,是否throwError为您的用例提供更好的界面?

关于Haskell monads 和不需要字符串的失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8602117/

相关文章:

debugging - Haskell:寻找不完整记录构建的来源

带有 Coproduct 和 monad 转换器的 Scala Free Monads

haskell - Cabal:如何在同一个项目中配置可传递的构建依赖项

haskell - 访问状态 Monad haskell 中的计数

functional-programming - 寻找学习练习: implement these monads

haskell - 对 IORefs 的混淆以制作计数器

haskell - 对Haskell Monad变形金刚感到困惑

haskell - StateT s (ExceptT e m) 和 exceptT e (StateT s m) 有什么区别?

Haskell 类型同义词联合?

haskell - FoldMap 采用错误类型的参数?