2014-04-25 46 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'是一個已經是類型的元組,對嗎? –