相关疑难解决方法(0)

验证OCaml函数是否为尾递归

如何判断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)

compiler-construction ocaml tail-recursion short-circuiting

7
推荐指数
2
解决办法
838
查看次数

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

在 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]注释?(如果在第二个例子中可能的话)

ocaml tail-recursion

6
推荐指数
1
解决办法
2446
查看次数