如何使用OCaml的[@tailcall]注释来断言尾递归?

时间:2016-08-09 06:34:16

标签: ocaml tail-recursion

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

明显,简单的例子:

let rec f = function
  | 0 -> 0
  | x -> (f [@tailcall]) (x - 1) (* works like a charm *)

但是,我不知道如何能够做到这一点并不那么明显"地方:

let rec f = function
  | 0 -> 0
  | x -> (|>) (x - 1) f (* uh? *)

我可以从汇编代码中看到,后一个例子被编译器识别为尾递归。所以,直到某人实施[@tailrec]:我在哪里放置[@tailcall]注释? (如果第二个例子中可能的话)

2 个答案:

答案 0 :(得分:2)

文档说in subsection 18.1

  

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

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

答案 1 :(得分:1)

你试过了吗?

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