在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]
注释? (如果第二个例子中可能的话)
答案 0 :(得分:2)
“ocaml.tailcall”或“tailcall”可以应用于函数应用程序,以检查调用是否是尾调优化的。如果不是这种情况,则发出警告(51)。
由于您的第二个示例不适用f
,因此该属性不适用于此上下文。
答案 1 :(得分:1)
let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) (f[@tailcall])