【问题标题】:Why does Haskell's Monad implementation fail function result differ from error's result?为什么 Haskell 的 Monad 实现失败函数结果与错误结果不同?
【发布时间】:2018-01-17 11:50:41
【问题描述】:

我正在尝试理解 monads 并阅读它的类型类定义:

class Monad m where
    .
    .
    .
fail :: String -> m a
fail msg = error msg

现在,错误的定义是:

error :: [Char] -> a

在这种情况下类型系统不应该抱怨吗?作为 a /= m a

或者类型系统会自动假设错误的结果将被转换为

m a

不知何故?

提前致谢

【问题讨论】:

  • am a 中的a 不同。看到它就像error :: [Char] -> b,然后是b ~ m a
  • 这就解释了,非常感谢!
  • 换句话说,fail 承诺它可以返回的类型集是error 承诺它可以返回的类型集的严格子集。

标签: haskell


【解决方案1】:

failerror 的类型签名中的 as 是类型变量。我们可以重命名它们而不改变它们的含义,例如

error :: [Char] -> b
error :: [Char] -> c
error :: [Char] -> d

所有这些类型签名都具有相同的含义;我们只是在类型级别上使用了 alpha 转换。

现在我们设置b ~ m a,其中mfail的上下文固定,我们看到error可以被使用:

fail :: String -> m a
fail msg = error msg    -- error :: String -> b
                        --                    b ~ m a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多