Come estrarre i dati da F lista #
Domanda
In seguito mia domanda precedente , sto lentamente ottenendo il blocco di FParsec (anche se io lo trovo particolarmente difficile da Grok).
Il mio prossimo newbie F # domanda è: come faccio a estrarre i dati dalla lista il parser crea?
Per esempio, ho caricato il codice di esempio dalla domanda precedente in un modulo chiamato Parser.fs, e aggiunto un test molto semplice unità in un modulo separato (con i relativi riferimenti). Sto utilizzando 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", ???)
In modo interattivo, quando eseguo parse "1" la risposta è:
val it : Element list = [Number "1"]
e modificando l'elenco degli operatori validi, posso correre parse "1 + 1" per ottenere:
val it : Element list = [Number "1"; Operator "+"; Number "1"]
Di cosa ho bisogno di mettere al posto del mio ??? nel frammento di cui sopra? E come faccio a verificare che si tratta di un numero piuttosto che un operatore, ecc.?
Soluzione
F # tipi (inclusi gli elenchi) implementare l'uguaglianza strutturale. Questo significa che se si confrontano due liste che contengono alcuni tipi F # utilizzando =
, verrà restituito vero quando i tipi hanno la stessa lunghezza e contengono elementi con le stesse proprietà.
Supponendo che il tipo Element
è un'unione discriminata definito in F # (e non è un tipo di oggetto), si dovrebbe essere in grado di scrivere solo:
Assert.Equal(interim, [Number "1"; Operator "+"; Number "1"])
Se si voleva implementare l'uguaglianza te stesso, allora si potrebbe utilizzare il pattern matching;
let expected = [Number "1"]
match interim, expected with
| Number a, Number b when a = b -> true
| _ -> false