Haskell equivalente a “construção” do Python
Pergunta
Construir é uma DSL implementado em Python usado para descrever estruturas de dados (binários e textuais). Depois de ter a estrutura de dados descrita, construção pode analisar e construí-lo para você. O que é bom ( "seco", "declarativa", "denotacional-Semântica" ...)
Exemplo de uso:
# 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),
),
),
)
Eu estou em necessidade de tal ferramenta para Haskell e Gostaria de saber se algo como isto existe.
Eu sei de:
- Data.Binary: implementos Usuários análise e construção separadamente
- Parsec: Apenas para analisar? Apenas para texto?
Eu acho que é preciso usar o modelo Haskell para conseguir isso?
Solução 3
Atualmente (afaik) não existe equivalente a construir em Haskell.
Pode ser implementado usando o modelo de Haskell.
Outras dicas
Eu diria que depende do que você quer fazer, e se você precisa para cumprir com qualquer formato existente.
Data.Binary vai (surpresa!) Ajuda-lo com dados binários, leitura e escrevendo. Você pode escrever o código para ler / escrever-se, ou deixar de ir os detalhes e gerar o código necessário para as suas estruturas de dados usando algumas ferramentas adicionais como deriva ou Derive . DRIFT funciona como um pré-processador, enquanto Derive pode funcionar como um pré-processador e com TemplateHaskell.
Parsec só irá ajudá-lo com a análise de texto. Sem dados binários (como facilmente), e não escrita. O trabalho é feito com String
s regulares. Há equivalentes ByteString
sobre hackage.
Para o seu exemplo acima eu usaria Data.Binary e personalizados gravação put
/ get
ers eu.
Dê uma olhada na analisador categoria em hackage para mais opções.
Eu não sei nada sobre Python ou construir, de modo que este não é provavelmente o que você está procurando, mas para estruturas de dados simples que você pode ler sempre apenas derive:
data Test a = I Int | S a deriving (Read,Show)
Agora, para a expressão
read "S 123" :: Test Double
GHCi emitirá: S 123,0
Para qualquer coisa mais complexa, você pode fazer uma instância de leitura usando Parsec.