8

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)
4

1 に答える 1

1

私の知る限り--optimize=tailc、サポートされている F# コンパイラ フラグではありません。

Mono で tailcall-optimization サポートを有効/無効にする方法はないと思います (とにかくコマンドラインから)。末尾呼び出しの最適化を有効にする F# コンパイラ フラグは ですが、既定でオンになっているコンパイラ オプション (F#)--tailcalls+によると。

これを解決するための最良の選択肢は次のとおりだと思います。

  • Xamarin でバグ レポートを提出する
  • #monodev IRC チャンネル (irc.gnome.org) にアクセスして、そこにいる開発者/貢献者の 1 人があなたを助けてくれるかどうかを確認してください。
于 2013-08-26T19:02:58.383 に答える