OCaml中的CPS:类型没有检查

时间:2016-03-22 14:56:44

标签: functional-programming ocaml

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

  

文件" tmp.ml",第8行,字符9-14:

     

错误:此表达式的类型为int - > int - > (int - > int) - > INT          但是期望表达式为int

我理解编译器在第8行需要int,因为第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)

1 个答案:

答案 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

表示您的函数采用 6 参数:inkin和{{ 1}}。你可能想写:

k