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?

Foi útil?

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 Strings regulares. Há equivalentes ByteString sobre hackage.

Para o seu exemplo acima eu usaria Data.Binary e personalizados gravação put / geters 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top