Ich bin relativ neu in F # und habe wirklich einen echten Kampf mit dem Parsen eines Ausdrucksbaums, der verschachtelte Listen enthält. Aus Kleinigkeiten im Internet habe ich folgendes zusammengeschustert.Analysieren des Ausdrucksbaums in verschachtelte Listen
Mein Standardtyp definiert:
type Return =
| Real of float
| Func of string * Return list
ich einen Funktionsaufruf an eine externe Anwendung zu machen, die wie etwas zurückgibt:
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])])
und die ich in
zu analysieren bin benötigen[ [1.0; 2.0; 3.0] ; [1.0; 2.0; 3.0] ; [1.0; 2.0; 3.0] ]
Mein ursprünglicher naive Gedanke war entlang der Linien
let rec parse data =
match data with
| Real(y) -> y
| Func("List", x) -> x |> List.map parse
| _ -> failwithf "Unrecognised"
aber es beschwert sich über die Typenunterschiede, die ich jetzt verstehe.
Mein zweiter Gedanke ist, vielleicht einige rekursive List.fold zu verwenden (wie ich kann über die Liste der Reals und die inneren Listen, aber nicht herausfinden, wie es in eine rekursive Funktion zu verallgemeinern, ohne den Compiler beschweren aus Typ). Jenseits meiner gegenwärtigen intellektuellen Feuerkraft.
Mein dritter Gedanke ist, dass vielleicht die Rückkehr, die ich von der externen Anwendung bekomme, dies zu schwierig macht, da es im Tupel fst keinen Hinweis darauf gibt, was in dem Tupel-Snd ist, abgesehen davon, dass es eine "Liste" ist von etwas"?
Es ist das: Convert tree to list aber es ist so kryptisch wie die Lösungen, die ich tbh versuche.
Irgendwelche Hinweise, auf welche Avenue ich verfolge, würde wirklich geschätzt werden.
Das ist großartig, danke. Ich denke immer noch über Typen zu lose nach, aber das gibt mir die Struktur, die ich brauche. –