2014-06-15 34 views
-1

在OCaml的顶层,我有以下类型定义: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的顶级告诉我head的类型是'a lazy_list lazy_list -> 'a lazylist为什么类型不是'a lazy_list -> 'a,这是我所期望的?

+0

为什么downvote? – Bladt

回答

1

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

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

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

如果head的类型仅仅是'a laty_list -> 'a,Nil将不会是有效的结果。

+0

啊,当然。谢谢。 – Bladt