Вопрос

Сконструировать является 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 и Интересно, существует ли что-то подобное.

Я знаю о:

  • Данные.Двоичный файл:Пользователь реализует синтаксический анализ и построение отдельно
  • Парсек:Только для синтаксического анализа?Только для текста?

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

Это было полезно?

Решение 3

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

Один из них может быть реализован с помощью шаблона Haskell.

Другие советы

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

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

Парсек поможет вам только с разбором текста.Никаких двоичных данных (так же легко) и никакой записи.Работа выполняется с регулярным Strings.Есть такие ByteString эквиваленты на взломе.

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

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

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

Теперь, что касается выражения

read "S 123" :: Test Double

GHCi будет выделять:S 123,0

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top