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它们是一样的吗?
发布于 2011-05-18 13:27:10
目前,Parsec有两个广泛使用的主要版本: Parsec 2和Parsec 3。
我的建议是简单地使用Parsec 3的最新版本,但如果你想做一个认真的选择,请继续阅读。
第3段中的新特性
Monad Transformer
Parsec 3引入了一个monad转换器,ParsecT,它可以用来将解析与其他一元效果结合起来。
流
虽然Parsec 2允许您选择标记类型(当您想要将词法分析与解析分开时,这是很有用的),但标记总是排列在列表中。列表可能不是存储大文本的最有效的数据结构。
Parsec 3可以处理任意的流--具有类似列表的接口的数据结构。您可以定义自己的流,但第3部分还包括一个基于ByteString (用于Char-based解析)的流行且高效的流实现,它通过模块Text.Parsec.ByteString和Text.Parsec.ByteString.Lazy公开。
更喜欢Parsec 2的理由
所需扩展更少
Parsec 3提供的高级特性不是免费的;要实现它们,需要几个语言扩展。
这两个版本都不是Haskell-2010 (即都使用扩展),但Parsec 2使用的扩展比Parsec 3少,因此任何给定编译器编译Parsec 2的机会都高于Parsec 3。
到目前为止,这两个版本都可以与GHC一起工作,而Parsec 2也是与JHC一起构建的reported,并被包括在JHC的标准库中。
性能
最初(即3.0版本) Parsec 3比Parsec 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的临时替代品。
发布于 2011-05-17 19:37:35
我认为后者是Parsec 2的向后兼容层,是用较新的API实现的。
https://stackoverflow.com/questions/6029371
复制相似问题