Эквивалент Haskell “Конструкции” Python в Haskell
Вопрос
Сконструировать является 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.
Парсек поможет вам только с разбором текста.Никаких двоичных данных (так же легко) и никакой записи.Работа выполняется с регулярным String
s.Есть такие 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 .