Je suis en train de mettre en place des règles dans une structure arborescente, avec portes logiques à savoir et, pas, ou ainsi que les conditions, par exemple la propriété x est égale à la valeur et. J'ai d'abord écrit la fonction récursive la plus évidente, qui a fonctionné. J'ai alors essayé d'écrire une version qui ne provoquerait pas un débordement de pile dans le style de passage continu prenant mon repère de this post about generic tree folding et de this answer on stackoverflow.F # fonction de construction d'arbre provoque un débordement de pile dans Xamarin studio
Cela fonctionne pour les petits arbres (profondeur d'environ 1000), mais malheureusement, lorsque vous utilisez un grand arbre, cela provoque un stackoverflow lorsque je l'exécute sur mon Mac avec Xamarin Studio. Quelqu'un peut-il me dire si j'ai mal compris comment F # traite le code récursif en queue ou si ce code n'est pas récursif?
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
C'est décevant. J'ai passé beaucoup de temps à penser que c'était ma mise en œuvre qui était le problème. J'ai trouvé ce [rapport de bogue] (https://bugzilla.xamarin.com/show_bug.cgi?id=12635#c11), qui ressemble à ceci et le commentaire final donne l'impression qu'il ne sera pas résolu bientôt. – NickL
Mono s'en va. Passez à .NET Core. –
@FyodorSoikin Je ne pense pas que Mono s'en aille bientôt pour Xamarin. – svick