haskell - Haskell 中的错误处理与 Either monad

标签 haskell error-handling type-inference monads

我有一个函数可以检查一个类型是否是另一种类型的子类型:

st :: Monad m => Map String Type  -- ^type environment
   -> Set (Type, Type) -- ^assumed subtypes
   -> (Type, Type) -- ^we are checking if lhs <: rhs      
   -> m (Set (Type, Type))

我想做错误处理。我有以下定义:
instance Monad (Either String) where
  return v = Right v
  fail s = Left s
  (Left s) >>= _ = Left s
  (Right v) >>= f = f v

有时我可以通过将 st 的结果视为 Either 来进行错误处理。例如,以下函数有效,并获取我在 st 中调用“失败”所产生的消息:
isSubType env cs t1 t2 = result where
  result = case st env (S.empty) (t1, t2) of
    Left msg -> Left msg
    Right rel -> Right ()

现在,我在 st 里面,我想递归地调用它。出于某种原因,以下代码嵌套在 st 深处:
  let do_t1 rel t1 = case st env rel (t1, t2) of
        Left msg -> fail $ printf "type %s in the union is not a subtype\
                           \ of the rhs, %s, because: %s" (renderType t1)
                           (renderType t2) (show msg)
        Right rel -> return rel

不输入检查,但给我以下错误:
 No instance for (Monad (Either t))
      arising from a use of `st'
                   at src/TypedJavaScript/Types.hs:386:24-42
    Possible fix: add an instance declaration for (Monad (Either t))

为什么将 st 的结果视为 Either 在 'st' 之外工作而不在内部工作?如何更改我的代码以使其也可以在内部工作?

最佳答案

我认为问题在于您调用 show msg你应该在哪里使用 msg .结果,编译器无法推断出您的意思是 Either String ;它只知道你有Either t其中约束 Show t很满意。更换show msgmsg应该修复它。

关于haskell - Haskell 中的错误处理与 Either monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/942651/

相关文章:

haskell - (Haskell) 按钮回调中的 gi-gtk 设置图像

ajax - 在浏览器中捕获服务器端 ajax 处理错误

javascript - 哪些错误事件不会触发 window.onerror?

java - 类型推断 : Java 7 Type Parameters

java - Eclipse Java 编译器和 OpenJDK 编译器之间的类型推断差异 (Java 8)

typescript - 如何根据可选参数的类型确定返回类型

未找到 Haskell 模块。我的项目的文件结构有什么问题?

haskell - 如何通过可能的输出查找列表中的最大元素

haskell - 类型签名缺少附带的绑定(bind)?

error-handling - 使用Seedstack和Undertow管理错误处理