首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用OCaml的[@tail tail]注释来断言尾递归?

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

Stack Overflow用户
提问于 2016-08-09 14:34:16
回答 2查看 1.3K关注 0票数 4

在OCaml中,[@tailcall]注释允许断言特定的函数调用是尾部调用(所以希望整个函数都是尾部递归的)。问题是:我到底应该把注解放在哪里?

显而易见,简单的例子:

代码语言:javascript
复制
let rec f = function
  | 0 -> 0
  | x -> (f [@tailcall]) (x - 1) (* works like a charm *)

但我不知道如何在“不太明显”的地方做到这一点:

代码语言:javascript
复制
let rec f = function
  | 0 -> 0
  | x -> (|>) (x - 1) f (* uh? *)

我可以从汇编代码中看到,后一个示例被编译器识别为尾递归。所以,在有人实现[@tailrec]之前:我到底应该把我的[@tailcall]注释放在哪里?(如果在第二个示例中可能的话)

EN

回答 2

Stack Overflow用户

发布于 2016-08-10 01:39:43

医生说in subsection 18.1

可以将

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

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

票数 3
EN

Stack Overflow用户

发布于 2016-08-09 17:49:26

你有没有尝试:

代码语言:javascript
复制
let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) (f[@tailcall])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38843684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档