为什么Haskell的Monad实现失败函数结果与错误结果不同?

时间:2018-01-17 11:50:42

标签: haskell

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

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

现在,错误的定义是:

error :: [Char] -> a

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

或类型系统是否自动假设错误结果将转换为

m a

不知?

提前致谢

1 个答案:

答案 0 :(得分:6)

afail类型签名中的error是类型变量。我们可以在不改变其含义的情况下重命名它们,例如。

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