簡體   English   中英

在OCaml中輸入推理

[英]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的類型:

  1. 你知道n類型是'a ,所以你可以派生(mnx)也有類型'a
  2. 你知道ls的類型為'b list ,這樣你就可以得到x的類型為'b
  3. m采用類型的兩個參數, 'a和類型'b ,並且產生類型的結果'a 所以, m類型為'a -> 'b -> 'a

因此,整個函數有類型('a -> 'b -> 'a) -> 'a -> 'b list -> 'a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM