Хаскельский эквивалент Python "Construct" - PullRequest
3 голосов
/ 04 августа 2009

Construct - это DSL, реализованный на Python, который используется для описания структур данных (двоичных и текстовых). Как только вы определили структуру данных, construct может проанализировать и построить ее для вас. Что хорошо («СУХОЙ», «Декларативный», «Денотационная семантика» ...)

Пример использования:

# 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),
    ),
  ),
)

Мне нужен такой инструмент для Haskell и Интересно, существует ли что-то подобное?

Я знаю:

  • Data.Binary: пользователь выполняет анализ и сборку отдельно
  • Parsec: только для разбора? Только для текста?

Я полагаю, что для этого нужно использовать Template Haskell?

Ответы [ 3 ]

1 голос
/ 04 августа 2009

Я бы сказал, что это зависит от того, что вы хотите сделать, и от того, нужно ли вам соблюдать какой-либо из существующих форматов.

Data.Binary (удивительно!) Поможет вам с двоичными данными, как для чтения, так и для записи. Вы можете либо написать код для чтения / записи самостоятельно, либо отказаться от деталей и сгенерировать необходимый код для своих структур данных, используя некоторые дополнительные инструменты, такие как DrIFT или Derive . DrIFT работает как препроцессор, тогда как Derive может работать как препроцессор и с TemplateHaskell.

Parsec поможет вам только с анализом текста. Нет двоичных данных (как легко) и нет записи. Работа выполняется с обычными String с. На взломе ByteString эквивалентов.

Для вашего примера, приведенного выше, я бы использовал Data.Binary и написал свой собственный put / get. Взгляните на категорию парсера на hackage для получения дополнительных опций.

0 голосов
/ 28 августа 2009

В настоящее время (afaik) в Haskell нет эквивалента Construct.

Можно реализовать с помощью Template Haskell.

0 голосов
/ 04 августа 2009

Я ничего не знаю о Python или Construct, так что это, вероятно, не то, что вы ищете, но для простых структур данных вы всегда можете просто получить read:

data Test a = I Int | S a deriving (Read,Show)

Теперь для выражения

read "S 123" :: Test Double

GHCi будет излучать: S 123,0

Для чего-то более сложного вы можете создать экземпляр Read, используя Parsec.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...