oCaml がこのコードを末尾再帰に最適化するかどうか疑問に思っています。そうであれば F# もそうですか?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
oCaml がこのコードを末尾再帰に最適化するかどうか疑問に思っています。そうであれば F# もそうですか?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
再帰的な場合 (つまり、xs が空でない場合)、最後に評価される演算は加算です。関数を末尾再帰にするためには、最後に評価された操作が sum の再帰呼び出しである必要があります。
このような関数は通常、末尾再帰にするためにアキュムレータを含むヘルパー関数を使用して定義されます。この場合、それは合計されるリストと合計の現在の値を取る関数になります。リストが空の場合、合計の現在の値が返されます。リストが空でない場合は、リストの末尾と合計の現在の値 + リストの先頭を引数として自分自身を呼び出します。sum 関数は、リストと合計の現在の値として 0 を使用してヘルパー関数を呼び出すだけです。
いいえ、このコードは末尾再帰ではなく、ocaml はそれを変換しません。あなたはそれを自分でしなければなりません。
F# についてはわかりませんが、これが最適化されるとは思えません。