Text.ParserCombinators.Parsec和Text.Parsec之间有什么区别

Nyb*_*ble 42 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
Run Code Online (Sandbox Code Playgroud)

它们是一样的吗?

Rom*_*aka 40

目前有两种广泛使用的主要版本的Parsec,Parsec 2和Parsec 3.

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

Parsec 3中的新功能

Monad变压器

Parsec 3引入了monad变换器,ParsecT可用于将解析与其他monadic效果相结合.

流

虽然Parsec 2允许您选择令牌类型(当您希望将词法分析与解析分开时很有用),但令牌始终排列在列表中.列表可能不是存储大型文本的最有效数据结构.

Parsec 3可以处理任意流 - 具有类似列表的接口的数据结构.您可以定义自己的流,但Parsec 3还包括一个基于ByteString(Char基于解析)的流行且高效的Stream实现,通过模块Text.Parsec.ByteString和 Text.Parsec.ByteString.Lazy.

更喜欢Parsec 2的原因

需要更少的扩展

Parsec 3提供的高级功能并非免费提供:要实现它们,需要多个语言扩展.

无论是两个版本的是Haskell的-2010(即都使用扩展),但秒差距2使用比秒差距3少的扩展,从而使任意给定的编译器可以编译秒差距2机会比那些秒差距3更高.

到目前为止,两个版本都使用GHC,而Parsec 2也报告使用JHC构建,并作为JHC的标准库之一.

性能

最初(即,作为版本3.0)秒差距3是相当慢于秒差距2.然而,关于改进秒差距3性能工作已经完成,并且作为版本3.1秒差距3只比秒差距2稍慢(基准:1,2) .

兼容层

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

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


Mic*_*man 18

我认为后者是Parsec 2的向后兼容层,根据较新的API实现.