2013-07-03 34 views
1

我抓我的頭弄清楚這個功能這個函數的類型是如何推斷的?

let make_rec f_norec = 
    let rec f x = f_norec f x in 
    f 

這應該是

val make_rec : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>的簽名。

注意有一個奇怪的遞歸定義。當然,我錯過了一些知識。任何人都可以告訴我如何計算函數的類型(就像類型推斷系統一樣)?

非常感謝。

回答

6

與內部的人開始,並向外工作:

  1. 讓我們調用xa
  2. 然後f類型的類型爲a -> b其中bf
  3. f_norec結果類型需要fx,它必須返回與f相同的類型,因此(a->b) -> a -> b
  4. make_rec需要f_norec,並返回f。因此((a->b)->a->b) -> (a->b)。由於句法原因,最後一對括號可以省略。
+0

非常感謝。這非常有教育意義。 – tfboy

+0

我不明白,爲什麼最後一對括號可以省略? – Indicator

+0

@Indicator這就是正確的associative - >操作符的工作原理,它是這樣做的,因爲如果你有一個函數'f :: a - > b - > c'那麼這意味着如果你只提供了一個參數,你會得到一個函數'b - > c'。這是咖啡。 OTOH,如果類型是'(a - > b) - > c'',這意味着你有一個參數函數,它接受另一個函數'a - > b'並返回一個'c'。 – Ingo