在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]注释放在哪里?(如果在第二个示例中可能的话)
发布于 2016-08-10 01:39:43
医生说in subsection 18.1说
可以将
“ocaml.tailcall”或“tailcall”应用于函数应用程序,以检查调用是否经过了tailcall优化。如果不是,则发出警告(51)。
由于您的第二个示例不适用于f,因此该属性在此上下文中不适用。
发布于 2016-08-09 17:49:26
你有没有尝试:
let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) (f[@tailcall])https://stackoverflow.com/questions/38843684
复制相似问题