我确信这个问题有一个非常简单的答案,但是我已经盯着这个看了一整天了,我还是想不明白。
根据本教程,我正在实现一个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,_>,还是有其他我应该做的事情?
发布于 2012-09-22 16:07:27
|>>运算符就是您要找的。我引用the FParsec reference的话
val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 解析器p |>> f应用解析器p并返回函数应用程序f x的结果,其中x是由p返回的结果。
P |>> f是p >>= fun x -> preturn (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,它非常详细地使用了这个运算符。
https://stackoverflow.com/questions/12541115
复制相似问题