我正在尝试理解monad并阅读它的类型类定义:
class Monad m where
.
.
.
fail :: String -> m a
fail msg = error msg
现在,错误的定义是:
error :: [Char] -> a
在这种情况下,类型系统不应该抱怨吗?如
a /= m a
或类型系统是否自动假设错误结果将转换为
m a
不知?
提前致谢
答案 0 :(得分:6)
a
和fail
类型签名中的error
是类型变量。我们可以在不改变其含义的情况下重命名它们,例如。
error :: [Char] -> b
error :: [Char] -> c
error :: [Char] -> d
所有这些类型的签名具有相同的含义;我们只是在类型级别上使用alpha转换。
现在我们设置b ~ m a
,其中m
由fail
的上下文修正,我们看到error
可以使用:
fail :: String -> m a
fail msg = error msg -- error :: String -> b
-- b ~ m a