Je suis relativement nouveau à F # et j'ai vraiment du mal à analyser un arbre d'expression qui contient des listes imbriquées. De morceaux sur le web j'ai bricolé ensemble ce qui suit.Analyse de l'arborescence d'expressions en listes imbriquées
Mon type standard est défini:
type Return =
| Real of float
| Func of string * Return list
Je fais un appel de fonction à une application externe, qui retourne quelque chose comme:
val out : Return =
Func
("List",
[Func ("List",[Real 1.0; Real 2.0; Real 3.0]);
Func ("List",[Real 1.0; Real 2.0; Real 3.0]);
Func ("List",[Real 1.0; Real 2.0; Real 3.0])])
et que j'ai besoin d'analyser en
[ [1.0; 2.0; 3.0] ; [1.0; 2.0; 3.0] ; [1.0; 2.0; 3.0] ]
Ma première pensée naïve était sur le modèle de
let rec parse data =
match data with
| Real(y) -> y
| Func("List", x) -> x |> List.map parse
| _ -> failwithf "Unrecognised"
mais il se plaint des différences de type, que je comprends maintenant. Ma deuxième pensée est peut-être d'utiliser List.fold récursif (comme je peux replier la liste des Reals et obtenir les listes internes, mais ne peux pas comprendre comment généraliser dans une fonction récursive sans que le compilateur se plaint type de sortie). Au-delà de mon pouvoir de feu intellectuel actuel. Ma troisième pensée est que peut-être le retour que je reçois de l'application externe rend cela trop difficile, car il n'y a aucune indication dans le tuple fst sur ce qui est dans le tndle snd, en dehors du fait qu'il s'agit d'une "liste de quelque chose"?
Il y a ceci: Convert tree to list mais c'est aussi énigmatique que les solutions que j'essaye tbh.
Toute indication quant à l'avenue que je poursuis serait vraiment appréciée.
C'est super merci. Je pense clairement aux types trop lâches, mais cela me donne la structure dont j'ai besoin. –