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.?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top