我确信这有一个非常简单的答案,但我一整天都在盯着这个,我无法理解。
根据教程,我正在实现一个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,_>
,还是我还应该做些什么呢?
答案 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。