44 votes

Quelle est la différence entre Text.ParserCombinators.Parsec et 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
 

Sont-ils les mêmes?

40voto

Roman Cheplyaka Points 15145

Actuellement, il y a deux largement utilisés versions majeures de Parsec, Parsec 2 et Parsec 3.

Mon conseil est simplement d'utiliser la dernière version de Parsec 3. Mais si vous voulez faire un choix conscient, lire sur.

Nouveau en Parsec 3

Monade Transformateur

Parsec 3 introduit une monade transformateur, ParsecT, qui peut être utilisé pour combiner l'analyse avec d'autres monadique effets. Pour des exemples de ces combinaisons de voir la le chapitre sur les transformateurs.

Flux

Bien que Parsec 2 vous permet de choisir le type de jeton (ce qui est utile lorsque vous voulez séparer l'analyse lexicale à partir de l'analyse), les jetons sont toujours disposées dans des listes. La liste peut être pas le plus efficace structure de données pour stocker les textes de grands.

Parsec 3 pouvez travailler avec de l'arbitraire des flux -- structures de données sous forme de liste de l'interface. Vous pouvez définir vos propres cours d'eau, mais Parsec 3 comprend également un populaire et efficace des Flux de mise en œuvre, basé sur ByteString (pour Char-en fonction analyse syntaxique), exposée par les modules d' Text.Parsec.ByteStringet Text.Parsec.ByteString.Lazy.

Les raisons de préférer Parsec 2

Moins extensions nécessaires

Fonctionnalités avancées fournies par Parsec 3 ne sont pas gratuits: pour les mettre en œuvre plusieurs extensions de langage sont nécessaires.

Aucune des deux versions est Haskell-2010 (c'est à dire à la fois l'utilisation des extensions), mais Parsec 2 utilise moins d'extensions de Parsec 3, si les chances que tout compilateur pouvez compiler Parsec 2 sont plus élevés que ceux de Parsec 3.

Par ce temps, les deux versions de travail avec GHC, tout en Parsec 2 est également signaléà construire avec JHC et est inclus comme l'un des JHC des librairies standard.

Performance

À l'origine (c'est à dire de la version 3.0) Parsec 3 a été beaucoup plus lent que Parsec 2. Cependant, le travail sur l'amélioration de Parsec 3 performance a été fait, et à partir de la version 3.1 Parsec 3 est légèrement plus lent que Parsec 2 (repères: 1, 2).

La couche de compatibilité

Il a été possible de "ré-écrire" tous les Parsec 2 API en Parsec 3. Cette la couche de compatibilité est assurée par le Parsec 3 paquet dans le module de la hiérarchie Text.ParserCombinators.Parsec (la même hiérarchie qui est utilisé par Parsec 2), alors que la nouvelle Parsec 3 de l'API est disponible sous l' Text.Parsec de la hiérarchie.

Cela signifie que vous pouvez utiliser Parsec 3 que d'une baisse-dans le remplacement pour Parsec 2.

18voto

Michael Snoyman Points 14888

Je crois que ce dernier est une couche rétro-compatible pour Parsec 2, implémentée en termes de la nouvelle API.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X