Wie man Daten von F # Liste extrahieren
Frage
Meine nächste Neuling F # Frage ist, wie kann ich extrahieren Daten aus der Liste der Parser erstellt?
Zum Beispiel lud ich den Beispielcode aus der vorherige Frage in ein Modul namens Parser.fs und einen sehr einfachen Unit-Test in einem separaten Modul (mit den entsprechenden Referenzen) hinzugefügt. Ich verwende XUnit:
open Xunit
[<Fact>]
let Parse_1_ShouldReturnListContaining1 () =
let interim = Parser.parse("1")
Assert.False(List.isEmpty(interim))
let head = interim.Head // I realise that I have only one item in the list this time
Assert.Equal("1", ???)
interaktiv, wenn ich ausführen Parse "1" ist die Antwort:
val it : Element list = [Number "1"]
und durch die Liste der gültigen Operatoren zwicken, kann ich laufen Parse "1 + 1" bekommen:
val it : Element list = [Number "1"; Operator "+"; Number "1"]
Was muss ich an Ort und Stelle setzen meiner ??? im Snippet oben? Und wie kann ich überprüfen, ob es sich um eine Zahl ist, eher als ein Operator, etc.?
Lösung
F # Typen (einschließlich Listen) implementieren strukturelle Gleichheit. Dies bedeutet, dass, wenn Sie zwei Listen vergleichen, die einige F # -Typen mit =
enthalten, wird es wahr zurück, wenn die Typen die gleiche Länge und enthalten Elemente mit den gleichen Eigenschaften aufweisen.
Unter der Annahme, dass der Element
Typ eine diskriminierte Vereinigung in F # definiert ist (und ist keine Objekt-Typ), sollten Sie in der Lage sein, nur zu schreiben:
Assert.Equal(interim, [Number "1"; Operator "+"; Number "1"])
Wenn Sie die Gleichheit selbst implementieren wollen, dann könnten Sie Musterabgleich verwenden;
let expected = [Number "1"]
match interim, expected with
| Number a, Number b when a = b -> true
| _ -> false