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 稍慢 (基准: 1 、 2 )。
兼容层
可以在 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/