Analisando int ou float com FParsec

Estou tentando analisar um arquivo, usando FParsec, que consiste em valores float ou int. Estou enfrentando dois problemas pelos quais não consigo encontrar uma boa solução.

1

Ambospint32 epfloat analisará com êxito a mesma sequência, mas fornecerá respostas diferentes, por exemplopint32 retornará3 ao analisar a string"3.0" epfloat retornará3.0 ao analisar a mesma string. É possível tentar analisar um valor de ponto flutuante usandopint32 e falhe se a string for"3.0"?

Em outras palavras, existe uma maneira de fazer o seguinte código funcionar:

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 trecho de código colocará corretamente todos os valores de ponto flutuante no campofloatvalues lista, mas porquepfloat retorna"3.0" ao analisar a string"3", todos os valores inteiros também serão colocados nofloatvalues Lista.

2

O exemplo de código acima parece um pouco desajeitado para mim, então acho que deve haver uma maneira melhor de fazer isso. Eu considerei combiná-los usandochoice, no entanto, ambos os analisadores devem retornar o mesmo tipo para que isso funcione. Eu acho que eu poderia fazer uma união discriminada com uma opção para float e outra para int e converter a saída depint32 epfloat usando o|>> operador. No entanto, eu estou querendo saber se existe uma solução melhor?

questionAnswers(1)

yourAnswerToTheQuestion