Analizando int o float con FParsec

Estoy tratando de analizar un archivo, usando FParsec, que consiste en valores float o int. Me enfrento a dos problemas para los que no puedo encontrar una buena solución.

1

Ambospint32 ypfloat analizará con éxito la misma cadena, pero dará diferentes respuestas, por ejemplopint32 volverá3 al analizar la cadena"3.0" ypfloat volverá3.0 al analizar la misma cadena. ¿Es posible intentar analizar un valor de coma flotante usandopint32 y que falle si la cadena es"3.0"?

En otras palabras, ¿hay alguna manera de hacer que funcione el siguiente código?

let parseFloatOrInt lines =
    let rec loop intvalues floatvalues lines =
        match lines with
        | [] -> floatvalues, intvalues
        | line::rest ->
            match run floatWs line with
            | Success (r, _, _) -> loop intvalues (r::floatvalues) rest
            | Failure _ -> 
                match run intWs line with
                | Success (r, _, _) -> loop (r::intvalues) floatvalues rest
                | Failure _ -> loop intvalues floatvalues rest

    loop [] [] lines

Este código colocará correctamente todos los valores de punto flotante enfloatvalues lista, pero porquepfloat devoluciones"3.0" al analizar la cadena"3", todos los valores enteros también se colocarán enfloatvalues lista.

2

El ejemplo de código anterior me parece un poco torpe, así que supongo que debe haber una mejor manera de hacerlo. Consideré combinarlos usandochoice, sin embargo, ambos analizadores deben devolver el mismo tipo para que eso funcione. Supongo que podría hacer una unión discriminada con una opción para float y otra para int y convertir la salida depint32 ypfloat utilizando la|>> operador. Sin embargo, me pregunto si hay una mejor solución.

Respuestas a la pregunta(1)

Su respuesta a la pregunta