在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
,这是我期望的?
答案 0 :(得分:1)
您的功能的一个可能结果是Nil
。 Nil
是lazy_list
。因此,对于某些(或可能是所有)类型head
,t lazy_list
的结果类型必须为t
。
head
的另一个可能结果是x
,其中x
是给定列表的元素。因此,head
的结果类型必须是给定列表的元素类型。
通过组合这两条信息,我们可以得出结论,给定列表的元素类型本身必须是一个列表。因此,您的功能只能在列表列表上运行。
如果head
的类型仅为'a laty_list -> 'a
,则Nil
将无效。