Iは、例えば、ない、論理ゲート、すなわちとで、ツリー構造でいくつかのルールを構築するためにまたはなどの条件をしようとしていますプロパティxは、値yと等しい。私は最初に最も明白な再帰関数を書いた。私はその後、継続待ちのスタイルでスタックオーバーフローが発生しないようなバージョンを、this post about generic tree foldingとthis answer on stackoverflowからキューに入れて書きました。F#のツリー構築機能は、Xamarin Studioでスタックオーバーフローが発生
これは小さな木(深度約1000)で動作しますが、残念ながら大きな木を使用するとXamarin StudioでMac上で実行するとスタックオーバーフローが発生します。 F#がテール再帰コードを扱う仕組みや、このコードがテール再帰でないかどうか誤解しているかどうかは誰にでも分かりますか?
let FoldTree andF orF notF leafV t data =
let rec Loop t cont =
match t with
| AndGate (left, right)->
Loop left (fun lacc ->
Loop right (fun racc ->
cont (andF lacc racc)))
| OrGate (left, right)->
Loop left (fun lacc ->
Loop right (fun racc ->
cont (orF lacc racc)))
| NotGate exp ->
Loop exp (fun acc -> cont (notF acc))
| EqualsExpression(property,value) -> cont (leafV (property,value))
Loop t id
let evaluateContinuationPassingStyle tree data =
FoldTree (&&) (||) (not) (fun (prop,value) -> data |> Map.find prop |> ((=) value)) tree data
これは残念です。私の実装であると思っている間にかなりの時間を費やしました。この[バグレポート](https://bugzilla.xamarin.com/show_bug.cgi?id=12635#c11)が見つかりました。これはこれと一致しています。最終的なコメントはすぐに解決されないように見えます。 – NickL
モノが去っています。 .NETコアに切り替えます。 –
@FyodorSoikin私はモノがすぐにXamarinのために遠ざかるとは思わない。 – svick