我正在进行一项关于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)
答案 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 参数:i
,n
,k
,i
,n
和{{ 1}}。你可能想写:
k