Construct是用Python实现的DSL,用于描述数据结构(二进制和文本)。一旦掌握了所描述的数据结构,构造就可以为您解析并构建它。哪个好(“DRY”,“声明”,“Denotational-Semantics”......)
用法示例:
# 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这样的工具 我想知道这样的事情是否存在。
我知道:
我想我必须使用Template Haskell来实现这个目标吗?
答案 0 :(得分:1)
我说这取决于你想做什么,以及你是否需要遵守任何现有的格式。
Data.Binary(惊喜!)会帮助您处理二进制数据,包括读写。 您可以编写代码来自行读/写,也可以使用DrIFT或Derive之类的其他工具释放详细信息并为数据结构生成所需的代码。 DrIFT可用作预处理器,而Derive可用作预处理器和TemplateHaskell。
Parsec只会帮助您解析文本。没有二进制数据(很容易),也没有写作。通过常规String
完成工作。 hackage有ByteString
个等价物。
对于上面的示例,我将使用Data.Binary并自行编写自定义put
/ get
个。
有关更多选项,请查看parser category at hackage。
答案 1 :(得分:0)
我对Python或Construct一无所知,所以这可能不是你要搜索的内容,但对于简单的数据结构,你总是可以得到read:
data Test a = I Int | S a deriving (Read,Show)
现在,对于表达式
read "S 123" :: Test Double
GHCi将发出:S 123.0
对于任何更复杂的事情,你可以使用Parsec创建一个Read实例。
答案 2 :(得分:0)
目前(afaik)没有相当于Haskell中的Construct。
可以使用Template Haskell实现一个。