2011-01-16 2 views
3

Après my previous question, je commence lentement à comprendre FParsec (bien que je trouve cela particulièrement difficile de le faire).Comment extraire des données à partir de la liste F #

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

Par exemple, j'ai chargé l'exemple de code de la question précédente dans un module appelé Parser.fs, et 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 que c'est un numéro, plutôt qu'un opérateur, etc.?

Répondre

7

Les types F # (y compris les listes) implémentent l'égalité structurelle. Cela signifie que si vous comparez deux listes contenant des types F # en utilisant =, il retournera 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 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 vouliez mettre en œuvre l'égalité vous-même, vous pourriez utiliser la correspondance de modèle;

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