Text.ParserCombinators.Parsec和Text.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和Parsec 3。

我的build议只是使用Parsec 3的最新版本。但是如果你想做出有意识的select,请继续阅读。

Parsec新增3

Monad变压器

Parsec 3引入了一个monad变换器ParsecT ,可以用来将parsing与其他一元效果结合起来。

stream

虽然Parsec 2允许您select标记types(当您要将词法分析与parsing分开时,这非常有用),但标记始终排列在列表中。 列表可能不是存储大文本的最有效的数据结构。

Parsec 3可以处理任意stream – 具有类似列表接口的数据结构。 您可以定义自己的stream,但Parsec 3还包含基于ByteString(用于基于Char的parsing)的stream行且高效的Stream实现,通过模块Text.Parsec.ByteStringText.Parsec.ByteString.Lazy

理由更喜欢Parsec 2

需要更less的扩展

Parsec 3提供的高级function不是免费的:要实现它们,需要几种语言扩展。

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

到目前为止,这两个版本都与GHC一起工作,而Parsec 2也被报告与JHC一起构build,并且被包括在JHC的标准库之一中。

性能

最初(也就是3.0版本),Parsec 3比Parsec 2要慢很多。但是, 改善Parsec 3性能的工作已经完成,从版本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的直接替代品。

我相信后者是Parsec 2的一个向后兼容的层,用更新的API来实现。