首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FParsec组合器将Parser<char,_>,直到Parser<string,_>?

FParsec组合器将Parser<char,_>,直到Parser<string,_>?
EN

Stack Overflow用户
提问于 2012-09-22 13:49:56
回答 1查看 224关注 0票数 1

我确信这个问题有一个非常简单的答案,但是我已经盯着这个看了一整天了,我还是想不明白。

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

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

代码语言:javascript
复制
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,_>,还是有其他我应该做的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-22 16:07:27

|>>运算符就是您要找的。我引用the FParsec reference的话

代码语言:javascript
复制
val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 

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

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

例如:

代码语言:javascript
复制
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,它非常详细地使用了这个运算符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12541115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档