我正在做一个关于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)
发布于 2016-03-22 15:00:28
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
和k
。你可能打算写:
let rec f (i:int) (n:int) (k:int->int) :int
https://stackoverflow.com/questions/36157809
复制相似问题