FParsec组合器将Parser <char,_>转换为Parser <string,_>?</string,_> </char,_>

时间:2012-09-22 05:49:56

标签: parsing f# fparsec

我确信这有一个非常简单的答案,但我一整天都在盯着这个,我无法理解。

根据教程,我正在实现一个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)

问题是digitParser<char,_>,而int的第二个选项是Parser<string,_>。我通常会使用组合器将digit转换为Parser<char,_>,还是我还应该做些什么呢?

1 个答案:

答案 0 :(得分:3)

|>>运营商正是您所寻找的。我引用the FParsec reference

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

解析器p   |&GT;&GT; f应用解析器p并返回函数的结果   application f x,其中x是p返回的结果。

     

p |&gt;&gt; f是一个   优化的实现p>&gt; = fun x - &gt; preurn(f x)。

例如:

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)

您可能希望阅读使用此运算符的FParsec tutorial on parsing JSON