2011-01-16 17 views
3

Following my previous question, ich bin langsam den Dreh von FParsec (obwohl ich es besonders schwer zu grok finden).Wie man Daten aus F # Liste extrahiert

Mein nächster Neuling F # Frage ist, wie extrahiere ich Daten aus der Liste, die der Parser erstellt?

Zum Beispiel habe ich den Beispielcode aus der vorherigen Frage in ein Modul namens Parser.fs geladen und einen sehr einfachen Komponententest 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 Parse "1" die Reaktion auszuführen ist:

val it : Element list = [Number "1"] 

und durch die Liste der gültigen Operatoren zwicken, ich Parse laufen kann " 1 + 1" erhalten:

val it : Element list = [Number "1"; Operator "+"; Number "1"] 

Was muss ich anstelle meiner setzen ??? im obigen Ausschnitt? Und wie überprüfe ich, dass es sich um eine Nummer und nicht um einen Operator usw. handelt?

Antwort

7

F # -Typen (einschließlich Listen) implementieren strukturelle Gleichheit. Das heißt, wenn Sie zwei Listen vergleichen, die einige F # -Typen enthalten, die = verwenden, wird True zurückgegeben, wenn die Typen die gleiche Länge aufweisen und Elemente mit denselben Eigenschaften enthalten.

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 Sie könnten Mustervergleiche verwenden.

let expected = [Number "1"] 
match interim, expected with 
| Number a, Number b when a = b -> true 
| _ -> false 
Verwandte Themen