OCaml类型系统意外嵌套

时间:2014-06-15 21:20:05

标签: ocaml type-inference algebraic-data-types

在OCaml顶层,我有以下类型定义:

type 'a lazy_list =
| Nil
| Cons of 'a * 'a lazy_list
| LazyCons of 'a * 'a lazy_list

(本例简化)

这个功能定义:

let head = function
| Nil -> Nil
| Cons(x,_) | LazyCons(x,_) -> x

ocaml toplevel告诉我head的类型是'a lazy_list lazy_list -> 'a lazylist为什么类型不是'a lazy_list -> 'a,这是我期望的?

1 个答案:

答案 0 :(得分:1)

您的功能的一个可能结果是NilNillazy_list。因此,对于某些(或可能是所有)类型headt lazy_list的结果类型必须为t

head的另一个可能结果是x,其中x是给定列表的元素。因此,head的结果类型必须是给定列表的元素类型。

通过组合这两条信息,我们可以得出结论,给定列表的元素类型本身必须是一个列表。因此,您的功能只能在列表列表上运行。

如果head的类型仅为'a laty_list -> 'a,则Nil将无效。