我的工作很簡單的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)
你有沒有試圖省略類型註釋?從使用的操作員中很容易推斷出類型。 –