Question

Suivi ma précédente question , je reçois lentement le coup de FParsec (bien que je trouve particulièrement difficile à Grok).

Mon prochain débutant F question # est, comment puis-je extraire des données de la liste de l'analyseur crée?

Par exemple, je charge le code échantillon de la question précédente dans un module appelé Parser.fs, et a ajouté un test unitaire très simple dans un module séparé (avec les références appropriées). J'utilise 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", ???) 

interactivement, quand j'exécute parse "1" la réponse est:

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

et en modifiant la liste des opérateurs valides, je peux courir parse "1 + 1" pour obtenir:

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

Que dois-je mettre en place ma ??? dans l'extrait ci-dessus? Et comment puis-je vérifier qu'il est un numéro, au lieu d'un opérateur, etc.?

Était-ce utile?

La solution

F types de # (y compris les listes) mettre en œuvre l'égalité structurelle. Cela signifie que si vous comparez deux listes qui contiennent certains types F de # en utilisant =, il retourne vrai lorsque les types ont la même longueur et contiennent des éléments ayant les mêmes propriétés.

Si l'on suppose que le type de Element est une union discriminée définie dans F # (et pas un type d'objet), vous devriez être en mesure d'écrire simplement:

Assert.Equal(interim, [Number "1"; Operator "+"; Number "1"])

Si vous voulez mettre en œuvre l'égalité vous, vous pouvez utiliser la correspondance de motif;

let expected = [Number "1"]
match interim, expected with
| Number a, Number b when a = b -> true
| _ -> false
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top