44
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

彼らは同じですか?

4

2 に答える 2

40

現在、広く使用されている Parsec のメジャー バージョンには、Parsec 2 と Parsec 3 の 2 つがあります。

私のアドバイスは、単に Parsec 3 の最新リリースを使用することです。しかし、良心的な選択をしたい場合は、読み進めてください。

Parsec 3 の新機能

モナドトランスフォーマー

Parsec 3 では、モナド変換子 が導入されましたParsecT。これは、解析を他のモナド効果と組み合わせるために使用できます。

ストリーム

Parsec 2 ではトークンの種類を選択できますが (構文解析から字句解析を分離したい場合に便利です)、トークンは常にリストに配置されます。リストは、大きなテキストを格納するための最も効率的なデータ構造ではない場合があります。

Parsec 3 は、任意のストリーム(リストのようなインターフェースを持つデータ構造) を処理できます。独自のストリームを定義することもできますが、Parsec 3 にはChar、モジュールText.Parsec.ByteStringおよび Text.Parsec.ByteString.Lazy.

Parsec 2 を選ぶ理由

必要な拡張機能が少ない

Parsec 3 が提供する高度な機能は無料ではありません。それらを実装するには、いくつかの言語拡張が必要です。

2 つのバージョンはどちらも Haskell-2010 ではありません (つまり、両方とも拡張機能を使用しています) が、Parsec 2 は Parsec 3 よりも使用する拡張機能が少ないため、特定のコンパイラが Parsec 2 をコンパイルできる可能性は、Parsec 3 の場合よりも高くなります。

この時点で、どちらのバージョンも GHC で動作しますが、Parsec 2 もJHC でビルドされることが報告されており、JHC の標準ライブラリの 1 つとして含まれています。

パフォーマンス

もともと (つまり 3.0 バージョンの時点で) Parsec 3 は Parsec 2 よりもかなり遅かった. ただし、Parsec 3 のパフォーマンスを改善する作業が行われており、バージョン 3.1 の時点で、Parsec 3 は Parsec 2 よりわずかに遅いだけです (ベンチマーク: 12 ) 。 .

互換性レイヤー

Parsec 3 ですべての Parsec 2 API を「再実装」することが可能になりました。この互換性レイヤーは、モジュール階層 Text.ParserCombinators.Parsec(Parsec 2 で使用されるのと同じ階層) の下の Parsec 3 パッケージによって提供されますが、新しい Parsec 3 API はText.Parsec階層の下で使用できます。

これは、Parsec 2 のドロップイン代替品として Parsec 3 を使用できることを意味します。

于 2011-05-18T05:27:09.997 に答える
18

後者は、新しい API に関して実装された、Parsec 2 の下位互換性のあるレイヤーであると思います。

于 2011-05-17T11:37:35.133 に答える