2009-08-03 3 views
2

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

Использование:

# 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: Пользователь осуществляет синтаксический анализ и строительство отдельно
  • Парсек: только для разбора? Только для текста?

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

+1

+1. Мне нравится 'construct' –

ответ

0

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

Можно использовать с использованием шаблона Haskell.

0

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

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

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

read "S 123" :: Test Double 

GHCi издаст: S 123,0

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

+0

Я думаю, что вы имели в виду * emit * not * omit *. – rampion

+0

@rampion: Да, вы правы, я исправил его. Спасибо! – fishlips

+0

@fishlips: Construct позволяет анализировать определенные форматы файлов/протоколы. Если вы просто определите тип, эквивалентный данным, содержащимся в PNG-файле, его 'read' не будет анализировать файлы PNG.Parsec не решает мою проблему, потому что я хочу описать формат один раз, а затем иметь возможность разобрать и собрать его, а не просто анализировать. – yairchu

1

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

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

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

Для вашего примера выше я бы использовал Data.Binary и написал собственный файл put/get. Посмотрите на parser category at hackage для получения дополнительных опций.

+1

@L. Колмодин: Спасибо. если я правильно понимаю, то Drift и Derive автоматически выводят для меня экземпляры. что я не могу указать, каким образом я хочу, чтобы данные были отформатированы. Никакой пакет в категории парсинга, кажется, не делает то, что мне нужно. Единственное, что я нашел похожим на Construct, это «Комбинированные трассы» (http://research.microsoft.com/~akenn/fun/picklercombinators.pdf). – yairchu

+1

@yairchu: Да, Drift и Derive будут автоматически выводить экземпляры. http://hackage.haskell.org/package/BitSyntax также может представлять интерес, похоже на ваш пример, хотя я не знаю, насколько он стабилен. API здесь: http://hackage.haskell.org/packages/archive/BitSyntax/0.3.2/doc/html/Data-BitSyntax.html –

 Смежные вопросы

  • Нет связанных вопросов^_^