1

我敢肯定,对此有一个非常简单的答案,但是我整天都在盯着它看,但我想不通。

根据教程,我正在实现一个 JSON 解析器。为了挑战自己,我自己实现了number解析器。

这是我到目前为止得到的:

let jnumber =
    let neg = stringReturn "-" -1 <|> preturn 1
    let digit = satisfy (isDigit)
    let digit19 = satisfy (fun c -> isDigit c && c <> '0')
    let digits = many1 digit
    let ``int`` =
        digit
        <|> (many1Satisfy2 (fun c -> isDigit c && c <> '0') isDigit)

麻烦的是那digit是一个Parser<char,_>,而第二个选项int是一个Parser<string,_>。我通常会只使用组合器digit变成Parser<char,_>,还是我应该做其他事情?

4

1 回答 1

3

|>>运算符就是您要找的。我引用FParsec 参考

val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 

解析器 p |>> f 应用解析器 p 并返回函数应用程序 fx 的结果,其中 x 是 p 返回的结果。

p |>> f 是 p >>= fun x -> preturn (fx) 的优化实现。

例如:

let jnumber =
    let neg = stringReturn "-" -1 <|> preturn 1
    let digit = satisfy (isDigit)
    let digit19 = satisfy (fun c -> isDigit c && c <> '0')
    let digits = many1 digit
    (digit |>> string) (* The operator is used here *)
    <|> (many1Satisfy2 (fun c -> isDigit c && c <> '0') isDigit)

您可能想阅读有关解析 JSON 的 FParsec 教程,该教程非常密集地使用此运算符。

于 2012-09-22T08:07:27.133 回答