根据Haskell 2010 语言报告,它的类型检查器是基于Hindley-Milner 的。所以考虑f
这种类型的函数,
f :: forall a. [a] -> Int
例如,它可能是长度函数。根据 Hindley-Milner 的说法,f []
类型检查到Int
. 我们可以通过实例化f
to的类型[Int] -> Int
和to 的类型[]
来证明这一点[Int]
,然后得出应用程序([Int] -> Int) [Int]
是类型的结论Int
。
在这个证明中,我选择实例化类型forall a. [a] -> Int
并forall a. [a]
替换Int
为a
. 我可以Bool
代替,证明也有效。在 Hindley-Milner 中我们可以将多态类型应用于另一个,而不指定我们使用哪些实例,这不是很奇怪吗?
更具体地说,Haskell 中的什么阻止我a
在实现中使用类型f
?我可以想象这f
是一个18
在 any 上[Bool]
等于的函数,并且在所有其他类型的列表上等于通常的长度函数。在这种情况下,将f []
是18
或0
?Haskell 报告说“内核没有正式指定”,所以很难说。