OCaml 中的 CPS:类型不检查

CPS in OCaml: type doesn't check

我正在 CPS 上做一个非常简单的 OCaml 练习。第8-10行是将两个递归调用转换为一个尾递归。但是,编译器抱怨第 8 行的类型:

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

我知道编译器在第 8 行需要 int,因为第 6 行 returns 是 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)

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

表示您的函数采用 6 个参数:inkink。您可能打算写:

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