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]
アノテーション? (2番目の例でまったく可能な場合)
回答:
回答№1は1試しましたか :
let rec f = function
| 0 -> 0
| x -> (|>) (x - 1) (f[@tailcall])
回答№2の場合は1
ドキュメントは言う 第18.1項の それ
呼び出しがテールコール最適化されていることを確認するために、「ocaml.tailcall」または「tailcall」を関数アプリケーションに適用できます。そうでない場合、警告(51)が発せられる。
あなたの2番目の例は当てはまらないので f
属性はこのコンテキストには適用されません。