2016-03-22 35 views
0

我的工作很簡單的OCaml的運動對CPS。第8-10行是將兩個遞歸調用轉換爲一個尾遞歸。然而,編譯器會抱怨8號線的類型:CPS OCaml中:類型不檢查

File "tmp.ml", line 8, characters 9-14:

Error: This expression has type int -> int -> (int -> int) -> int but an expression was expected of type int

我明白,編譯器期望的int在第8行,因爲第6點返回一個int。但是有人可以說明爲什麼8-10行的類型不是int嗎?

4 let rec f i n k (i:int) (n:int) (k:int->int) :int = 
    5  if i + n < 0 then 
    6   k 1 
    7  else 
    8   (f i (n-1) (fun v -> 
    9    f (i-1) n (fun vv-> 
10     k (v + vv)))) 
11 in f 1 1 (fun x -> x) 
+0

你有沒有試圖省略類型註釋?從使用的操作員中很容易推斷出類型。 –

回答

4

f i n-1被解析爲(f i n)-1而非f i (n-1)你可能期望。

此外,

let rec f i n k (i:int) (n:int) (k:int->int) :int 

意味着你的函數接受參數:inkink。你可能打算寫:

let rec f (i:int) (n:int) (k:int->int) :int 
+0

是的,謝謝。這消除了'a',但類型仍然不檢查。我已經更新了文字。 – qweruiop

+0

@qweruiop我已經更新了我的答案來解決這個問題。 – gallais

+0

我用'let rec f(i:int)(n:int)(k:int-> int):int'確認了它。 –