【问题标题】:CPS in OCaml: type doesn't checkOCaml 中的 CPS:类型不检查
【发布时间】:2016-07-09 13:00:34
【问题描述】:

我正在做一个关于 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)

【问题讨论】:

  • 你试过省略类型注释吗?很容易从使用的运算符中推断出类型。

标签: functional-programming ocaml


【解决方案1】:

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

【讨论】:

  • 好的,谢谢。这消除了'a,但仍然不检查类型。我已经更新了文字。
  • @qweruiop 我已经更新了我的答案以解决这个问题。
  • 我确认它使用let rec f (i:int) (n:int) (k:int-&gt;int) :int进行类型检查。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2011-07-31
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多