haskell - Text.ParserCombinators.Parsec 和 Text.Parsec 有什么区别

标签 haskell parsec

Text
    Text.Parsec
        Text.Parsec.ByteString
            Text.Parsec.ByteString.Lazy
        Text.Parsec.Char
        Text.Parsec.Combinator
        Text.Parsec.Error
        Text.Parsec.Expr
        Text.Parsec.Language
        Text.Parsec.Perm
        Text.Parsec.Pos
        Text.Parsec.Prim
        Text.Parsec.String
        Text.Parsec.Token
    ParserCombinators
        Text.ParserCombinators.Parsec
            Text.ParserCombinators.Parsec.Char
            Text.ParserCombinators.Parsec.Combinator
            Text.ParserCombinators.Parsec.Error
            Text.ParserCombinators.Parsec.Expr
            Text.ParserCombinators.Parsec.Language
            Text.ParserCombinators.Parsec.Perm
            Text.ParserCombinators.Parsec.Pos
            Text.ParserCombinators.Parsec.Prim
            Text.ParserCombinators.Parsec.Token

它们是一样的吗?

最佳答案

目前有两个广泛使用的 Parsec 主要版本:Parsec 2 和 秒差距 3。

我的建议只是使用最新版本的 Parsec 3。但是如果你想 做出认真的选择,继续阅读。

秒差距 3 中的新功能

Monad 变压器

Parsec 3 引入了一个 monad 转换器,ParsecT,它可用于组合 与其他单子(monad)效果进行解析。

尽管 Parsec 2 允许您选择 token 类型(当您 想要将词法分析与解析分开),标记始终是 排列成列表。列表可能不是最有效的存储数据结构 大文本。

Parsec 3 可以处理任意——具有类似列表的数据结构 界面。您可以定义自己的流,但 Parsec 3 还包括流行的 以及基于 ByteString 的高效 Stream 实现(对于基于 Char 解析),通过模块 Text.Parsec.ByteString 公开和 Text.Parsec.ByteString.Lazy

选择秒差距 2 的原因

需要更少的扩展

Parsec 3 提供的高级功能不是免费的;实现它们 需要多种语言扩展。

这两个版本都不是 Haskell-2010(即都使用扩展),但是 Parsec 2 使用的扩展少于 Parsec 3,因此任何给定的编译器都有可能 可以编译的 Parsec 2 高于 Parsec 3。

此时,两个版本都可以使用 GHC,而 Parsec 2 也是 reported到 使用 JHC 构建,并作为 JHC 的标准库之一包含在内。

性能

最初(即从 3.0 版本开始)Parsec 3 比 秒差距 2。但是,work on improving Parsec 3 performance已经完成了, 从版本 3.1 开始,Parsec 3 仅比 Parsec 2 稍慢 (基准: 12 )。

兼容层

可以在 Parsec 3 中“重新实现”所有 Parsec 2 API。这 兼容层由模块层次结构下的 Parsec 3 包提供 Text.ParserCombinators.Parsec(与 Parsec 2 使用的层次结构相同), 而新的 Parsec 3 API 可在 Text.Parsec 层次结构下使用。

这意味着您可以使用 Parsec 3 作为 Parsec 2 的直接替代品。

关于haskell - Text.ParserCombinators.Parsec 和 Text.Parsec 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029371/

相关文章:

Haskell 函数定义未按预期工作

haskell - 是否有一种更易读的方法来重写这个纯函数以使用 Writer Monad?

haskell - Parsec 解析器在 many1 和 manyTill 组合器上失败

haskell - 秒差距:回溯不起作用

haskell - 为什么 Parsec Choice 运算符似乎取决于解析器的顺序?

haskell - 我可以要求 GHC 在开发过程中为每个模块导入 Debug.Trace 吗?

haskell - 我可以将自定义包链接放入 stack.yaml 吗?

haskell - Parsec 不解析换行符

haskell - 应用式秒差距的问题

performance - 全局/本地环境影响 Haskell 的 Criterion 基准测试结果