Haskell, l’équivalent de & # 8220; Construct & # 8221; de Python
Question
Construct est un DSL implémenté en Python utilisé pour décrire les structures de données (binaires et textuelles). Une fois que vous avez décrit la structure de données, construct peut l’analyser et la construire pour vous. Ce qui est bon ("DRY", "Déclaratif", "Denotational-Semantics" ...)
Exemple d'utilisation:
# code from construct.formats.graphics.png
itxt_info = Struct("itxt_info",
CString("keyword"),
UBInt8("compression_flag"),
compression_method,
CString("language_tag"),
CString("translated_keyword"),
OnDemand(
Field("text",
lambda ctx: ctx._.length - (len(ctx.keyword) +
len(ctx.language_tag) + len(ctx.translated_keyword) + 5),
),
),
)
J'ai besoin d'un tel outil pour Haskell et Je me demande si quelque chose comme ça existe.
Je connais:
- Data.Binary: l'utilisateur implémente l'analyse et la construction séparément
- Parsec: uniquement pour l'analyse? Seulement pour le texte?
Je suppose qu’il faut utiliser le modèle Haskell pour y parvenir?
La solution 3
Il n’existe actuellement aucun équivalent à Construct in Haskell.
On peut être implémenté à l'aide de Template Haskell.
Autres conseils
Je dirais que cela dépend de ce que vous voulez faire et si vous devez respecter un format existant.
Data.Binary vous aidera (surprise!) avec des données binaires, à la fois en lecture et en lecture. l'écriture. Vous pouvez écrire le code pour lire / écrire vous-même ou laisser tomber les détails et générer le code requis pour vos structures de données en utilisant des outils supplémentaires tels que DrIFT ou dériver . DrIFT fonctionne comme un pré-processeur, alors que Derive peut fonctionner comme un pré-processeur et avec TemplateHaskell.
Parsec ne vous aidera qu'à analyser le texte. Pas de données binaires (aussi facilement), et pas d'écriture. Le travail est effectué avec des String
standard. Il existe des ByteString
équivalents sur le hackage.
Pour votre exemple ci-dessus, j'utiliserais Data.Binary et écrirais moi-même put
/ get
.
Consultez la catégorie d'analyse au piratage pour plus d'options.
Je ne connais rien à Python ou à Construct, ce n'est donc probablement pas ce que vous recherchez, mais pour les structures de données simples, vous pouvez toujours en déduire ce qui suit:
data Test a = I Int | S a deriving (Read,Show)
Maintenant, pour l'expression
read "S 123" :: Test Double
GHCi émettra: S 123.0
Pour tout ce qui est plus complexe, vous pouvez créer une instance de Read en utilisant Parsec.