类型推断多态递归函数

时间:2015-12-28 18:07:42

标签: haskell recursion polymorphism

维基百科上的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并成功进行类型检查?或问题出在其他地方?

0 个答案:

没有答案