维基百科上的Polymorphic recursion页面给出了以下示例,其中Haskell的类型检查器无法在没有显式类型注释的情况下推断类型:
data Nested a = a :<: (Nested [a]) | Epsilon
length Epsilon = 0
length (_ :<: xs) = 1 + length xs
编译此代码时,GHC说:
Occurs check: cannot construct the infinite type: t ~ [t]
Expected type: Nested t
Actual type: Nested [t]
Relevant bindings include
xs :: Nested [t]
length :: Nested t -> a
我理解t
如何成为[t]
,但我不明白为什么这对于类型搜索者来说是一个问题。如果我们让length
成为Nested t -> a
然后偶然发现length xs
并让它成为Nested [t] -> b
,为什么我们不能假设a ~ b
并成功进行类型检查?或问题出在其他地方?