2014-04-25 44 views
2
type 'a lazy_node = 
    | Empty 
    | Node of 'a * 'a lazy_list 
and 'a lazy_list = 'a lazy_node lazy_t 

let con x zl = lazy (Node (x,zl)) 

所以这里应该定义两种类型:'a lazy_node'a lazy_listOCaml在这种情况下如何推断类型?

我认为con的类型将是'a -> 'a lazy_list -> 'a lazy_list

然而,实际上,当我在utop试了一下,给了con这样的类型:

val con : 'a -> 'a lazy_list -> 'a lazy_node lazy_t = <fun>


为什么返回类型不是'a lazy_list? OCaml在这种情况下如何推断?

回答

3

在您的代码lazy_list不是一个新类型,但只是lazy_node lazy_t的别名。而Ocaml类型的参与者只考虑真实类型,而不是别名。所以它推断出真正的类型,并且不检查是否有这种类型的别名。

别名用于参数,因为Node (x,zl)意味着zl的类型为'a lazy_list

您可以添加类型注释强制使用别名:

let con x zl: 'a lazy_list = lazy (Node (x,zl)) 
+0

所以你的意思,甚至'类型“一MYTYPE =”清单* int'或'型MYTYPE = INT * float'不真正的类型,只是别名?您能否在您的回答中添加更多什么是实际类型和别名? –

+3

当你编写'type newtype = othertype'时,它会创建一个别名。 – Thomash

+0

好吧,明白了,谢谢。所以'输入'一个mytype ='一个列表* int'是一个别名,因为''列表* int'是一个已经是类型的元组,对吗? –