gpt4 book ai didi

f# - 使用 FParsec 解析 float 或 int*float

转载 作者:行者123 更新时间:2023-12-03 16:43:02 26 4
gpt4 key购买 nike

我刚刚开始玩 FParsec,现在我正在尝试解析以下格式的字符串

10*0.5 0.25 0.75 3*0.1 0.9

例如,我希望将 3*0.1 扩展为 0.1 0.1 0.1

到目前为止我所拥有的是以下内容
type UserState = unit
type Parser<'t> = Parser<'t, UserState>

let str s : Parser<_> = pstring s

let float_ws : Parser<_> = pfloat .>> spaces

let product = pipe2 pint32 (str "*" >>. float_ws) (fun x y -> List.init x (fun i -> y))

产品解析器正确解析格式 int*float 上的条目并将其扩展为浮点数列表。但是,我在想出一个允许我解析 int*float 的解决方案时遇到了麻烦。或者只是一个 float 。我想做类似的事情
many (product <|> float_ws)

这当然不起作用,因为解析器的返回类型不同。关于如何使这项工作的任何想法?是否可以包装修改 float_ws 使其返回一个只有一个浮点数的列表?

最佳答案

您可以制作 float_ws返回 float list只需添加一个 |>> List.singleton

let float_ws : Parser<_> = pfloat .>> spaces |>> List.singleton
|>>就是 map函数,您将一些函数应用于一个解析器的结果并接收某种新类型的新解析器:
val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u>

见: http://www.quanttec.com/fparsec/reference/primitives.html#members.:124::62::62 :

此外,由于 product parser 包含一个 int 解析器,它将成功解析错误情况下的字符,这意味着解析器状态将被更改。这意味着您不能使用 <|>直接在第一个解析器上使用运算符,您还必须添加 attempt因此 FParsec 可以返回到原始解析器状态。
let combined = many (attempt product <|> float_ws)

关于f# - 使用 FParsec 解析 float 或 int*float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com