[英]Type Inference in OCaml
我試圖圍繞OCaml的類型推斷符號。
例如:
# let f x = x [];;
val f : ('a list -> 'b) -> 'b = <fun>
我感覺合理。 val f接受一個函數x,它接受一個'a類型的列表並返回'b類型的東西。 然后f返回一個'b類型,因為它只調用x。
但是,一旦我們得到更多的論據,我就會更加困惑。
# let g a b c = a b c;;
val g : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c = <fun>
我可以假設如果函數有參數,那么類型推斷的第一個參數將始終是參數嗎? 如果我打電話給abc,是訂單((ab)c)還是(a(bc))?
# let rec h m n ls = match ls with
| [] -> n
| x::t -> h m (m n x) t;;
val h : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
至於這一個,我很困惑如何('a - >'b - >'a) - >'a派生。 我可以看到'b list對應於ls變量,而last'對應於終端符號n的類型。
我可以假設如果函數有參數,那么類型推斷的第一個參數將始終是參數嗎?
是的,函數類型的第一個參數是其第一個參數的類型。
如果我打電話給abc,是訂單((ab)c)還是(a(bc))?
順序是((ab) c)
(你可以用這種簡單的方式思考)
至於這一個,我很困惑如何('a - >'b - >'a) - >'a派生。 我可以看到'b list對應於ls變量,而last'對應於終端符號n的類型。
你是對的。 ls
有'b list
類型, n
有'a
類型。
讓我們考慮一下m
的類型:
n
類型是'a
,所以你可以派生(mnx)
也有類型'a
ls
的類型為'b list
,這樣你就可以得到x
的類型為'b
m
采用類型的兩個參數, 'a
和類型'b
,並且產生類型的結果'a
。 所以, m
類型為'a -> 'b -> 'a
因此,整個函數有類型('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.