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 个参数:i
、n
、k
、i
、n
和 k
。您可能打算写:
let rec f (i:int) (n:int) (k:int->int) :int
我正在 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 个参数:i
、n
、k
、i
、n
和 k
。您可能打算写:
let rec f (i:int) (n:int) (k:int->int) :int