私は次のように再帰的にシーケンスを定義するのが好きです。
let rec startFrom x =
seq {
yield x;
yield! startFrom (x + 1)
}
このような再帰シーケンスを実際に使用する必要があるかどうかはわかりません。は末尾再帰のようにyield!
見えますが、別のIEnumerable内から呼び出されているため、100%確実ではありません。私の見解では、コードは呼び出しごとにIEnumerableのインスタンスを閉じずに作成します。これにより、実際にはこの関数もメモリをリークします。
この関数はメモリをリークしますか?さらに言えば、それは「末尾再帰」でさえありますか?
[編集して追加]:答えを求めてNProfをいじくり回していますが、SOでの再帰シーケンスの実装に関する技術的な説明を得ることが役立つと思います。