我试图理解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)
不知何故?
提前致谢
在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)