如何使用OCaml';s[@tailcall]注释以断言尾部递归性?

如何使用OCaml';s[@tailcall]注释以断言尾部递归性?,ocaml,tail-recursion,Ocaml,Tail Recursion,在OCaml中,[@tailcall]注释允许您断言特定的函数调用是尾部调用(因此希望您的整个函数是尾部递归的)。问题是:我应该将注释准确地放置在哪里 显而易见的简单例子: let rec f = function | 0 -> 0 | x -> (f [@tailcall]) (x - 1) (* works like a charm *) 但我不知道如何在“不太明显”的地方做到这一点: 我可以从汇编代码中看出,编译器将后一个示例识别为尾部递归。因此,除非有人实现了[@t

在OCaml中,
[@tailcall]
注释允许您断言特定的函数调用是尾部调用(因此希望您的整个函数是尾部递归的)。问题是:我应该将注释准确地放置在哪里

显而易见的简单例子:

let rec f = function
  | 0 -> 0
  | x -> (f [@tailcall]) (x - 1) (* works like a charm *)
但我不知道如何在“不太明显”的地方做到这一点:

我可以从汇编代码中看出,编译器将后一个示例识别为尾部递归。因此,除非有人实现了
[@tailrec]
:我应该在哪里放置我的
[@tailcall]
注释?(如果在第二个示例中可能的话)

您是否尝试过:

let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) (f[@tailcall])
医生说

“ocaml.tailcall”或“tailcall”可应用于函数应用程序,以检查调用是否经过tailcall优化。如果不是这样,则发出警告(51)


由于第二个示例不适用于
f
,因此该属性在此上下文中不适用。

是的,解释器说:
警告53:“tailcall@attribute不能出现在此上下文中”
这是一个好的观点!这是否意味着,既然f不“直接”应用于(x-1),而是(|>)应用于(x-1)那么编译器不能实现尾部递归吗?我不想断言编译器能做什么和不能做什么。如果编译器目前没有生成尾部递归代码,那可能是因为还没有人想到这种情况,或者实现这种情况比看起来更复杂。我检查了程序集和编译器确实会为这两种情况生成一个循环。
let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) (f[@tailcall])