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

osk*_*132 1 haskell

我试图理解monads并阅读它的类型类定义:

class Monad m where
    .
    .
    .
fail :: String -> m a
fail msg = error msg
Run Code Online (Sandbox Code Playgroud)

现在,错误的定义是:

error :: [Char] -> a
Run Code Online (Sandbox Code Playgroud)

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

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

m a
Run Code Online (Sandbox Code Playgroud)

不知何故?

提前致谢

Zet*_*eta 6

a以s fail的和error的类型签名是一种类型的变量.我们可以在不改变其含义的情况下重命名它们,例如

error :: [Char] -> b
error :: [Char] -> c
error :: [Char] -> d
Run Code Online (Sandbox Code Playgroud)

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

现在我们设置b ~ m a,其中m由固定fail的情况下,我们看到,error能习惯:

fail :: String -> m a
fail msg = error msg    -- error :: String -> b
                        --                    b ~ m a
Run Code Online (Sandbox Code Playgroud)