【发布时间】:2016-02-03 10:11:45
【问题描述】:
我正在尝试使用 FParsec 解析一个文件,该文件由 float 或 int 值组成。我面临着两个我找不到好的解决方案的问题。
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.0",所以所有整数值也会放入floatvalues中列表。
2
上面的代码示例对我来说似乎有点笨拙,所以我猜一定有更好的方法来做到这一点。我考虑使用choice 组合它们,但是两个解析器必须返回相同的类型才能工作。我想我可以创建一个区分联合,其中一个选项用于 float,一个选项用于 int,并使用 |>> 运算符转换来自 pint32 和 pfloat 的输出。但是,我想知道是否有更好的解决方案?
【问题讨论】: