F# には、.net では問題なく動作するコードがいくつかありますが、Mono ではスタックがオーバーフローします。関連する問題は、利用可能なスタック領域がなくなる前に、そうするように見えることです (System.Threading.Thread (ts, 1000000000) で開始されます)。私が知る限り、それが終了するフォールドは末尾再帰的であり、スタック トレースは末尾の最適化が行われていないように見えます。--optimize=tailc で 3.2.1 を実行しています。
どの種類の末尾呼び出しが呼び出しスタックを削除し、どれが削除しないかを誰かが正確に知っていますか? あるいは、より多くのスタックを割り当てる方法は? どうもありがとう。
Mono での Tailcall の除去を認識しています
編集: コメントで要求されたコードの概要を次に示します。これは大きなデータ構造の折り畳みの一部ですが、失敗したスタックトレースには mapk と myfold しかありません。
let rec myfold f x k =
let rec mapk xs k =
match xs with
[] -> k []
| x::xs -> mapk xs (fun xs' -> myfold f x (fun x' -> (x' :: xs') |> k))
...
mapk (...) ( ... >> k)