float または int 値で構成される FParsec を使用して、ファイルを解析しようとしています。適切な解決策が見つからない 2 つの問題に直面しています。
1
pint32
とはどちらもpfloat
同じ文字列を正常に解析しますが、異なる答えpint32
を返します。たとえば3
、文字列"3.0"
を解析するpfloat
と戻り3.0
、同じ文字列を解析すると戻ります。を使用して浮動小数点値の解析を試みpint32
、文字列が の場合に失敗することは可能"3.0"
ですか?
つまり、次のコードを機能させる方法はありますか。
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
このコードはすべての浮動小数点値をfloatvalues
リストに正しく配置しますが、文字列を解析するときにpfloat
返されるため、すべての整数値もリストに配置されます。"3.0"
"3"
floatvalues
2
上記のコード例は私には少し不器用に思えるので、もっと良い方法があるに違いないと思います。を使用してそれらを結合することを検討しましたchoice
が、両方のパーサーが同じ型を返す必要があります。pint32
float 用と int 用の 1 つのオプションを使用して判別共用体を作成し、演算子からの出力と演算子をpfloat
使用して変換できると思います|>>
。しかし、より良い解決策があるかどうか疑問に思っていますか?