如何判断OCaml是否将特定函数识别为尾递归?特别是,我想知道OCaml编译器是否识别短路运算符和尾递归
感谢Jeffrey在下面的回答,我尝试了这个简单的功能
let rec check_all l =
match l with
| [] -> true
| hd :: tl ->
hd && check_all tl
Run Code Online (Sandbox Code Playgroud)
事实上,它确实优化到:
camlTest__check_all_1008:
.cfi_startproc
.L102:
cmpl $1, %eax
je .L100
movl (%eax), %ebx
cmpl $1, %ebx
je .L101
movl 4(%eax), %eax
jmp .L102
.align 16
.L101:
movl $1, %eax
ret
Run Code Online (Sandbox Code Playgroud) 在 OCaml 中,[@tailcall]
注释可以让您断言特定的函数调用是尾调用(因此希望您的整个函数是尾递归的)。问题是:我应该将注释准确放置在哪里?
明显、简单的例子:
let rec f = function
| 0 -> 0
| x -> (f [@tailcall]) (x - 1) (* works like a charm *)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在“不太明显”的地方做到这一点:
let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) f (* uh? *)
Run Code Online (Sandbox Code Playgroud)
从汇编代码中我可以看到,后一个示例被编译器识别为尾递归。所以直到有人实现[@tailrec]
:我到底应该在哪里放置[@tailcall]
注释?(如果在第二个例子中可能的话)