Pregunta

mi pregunta anterior , estoy consiguiendo poco a poco la caída de FParsec (aunque yo lo encuentro particularmente difícil de asimilo).

Mi siguiente novato F # pregunta es, ¿cómo puedo extraer los datos de la lista crea el analizador?

Por ejemplo, carga el código de ejemplo de la pregunta anterior en un módulo llamado Parser.fs, y ha añadido una unidad de prueba muy simple en un módulo separado (con las referencias apropiadas). Estoy usando 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", ???) 

interactiva, cuando yo haga parse "1" es la respuesta:

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

y mediante la deformación de la lista de operadores válidos, puedo correr parse "1 + 1" para obtener:

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

¿Qué necesito para poner en su lugar de mi ??? en el fragmento anterior? Y ¿cómo puedo comprobar que se trata de un número, en lugar de un operador, etc.?

¿Fue útil?

Solución

F # tipos (incluyendo listas) poner en práctica la igualdad estructural. Esto significa que si se comparan dos listas que contienen algunos tipos F # con =, se volverán cierto cuando los tipos tienen la misma longitud y contienen elementos con las mismas propiedades.

Si se asume que el tipo Element es una unión discriminada definido en F # (y no es un tipo de objeto), que debe ser capaz de escribir simplemente:

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

Si quisiera poner en práctica la igualdad de ti mismo, entonces se podría utilizar la coincidencia de patrones;

let expected = [Number "1"]
match interim, expected with
| Number a, Number b when a = b -> true
| _ -> false
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top