[英]Haskell equivalent of Python's “Construct”
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这样的工具,我想知道这样的事情是否存在。
我知道:
我想必须使用Template Haskell来实现这一目标吗?
我会说这取决于你想做什么,以及你是否需要遵守任何现有的格式。
Data.Binary将(惊喜!)帮助您读取和写入二进制数据。 您可以编写代码来自行读/写,也可以使用DrIFT或Derive等其他工具释放详细信息并为数据结构生成所需的代码。 DrIFT可用作预处理器,而Derive可用作预处理器和TemplateHaskell。
Parsec只会帮助您解析文本。 没有二进制数据(很容易),也没有写作。 使用常规String
完成工作。 hackage上有ByteString
等价物。
对于上面的示例,我将使用Data.Binary并自己编写自定义put
/ get
ers。 有关更多选项,请查看hackage中的解析器类别 。
我对Python或Construct一无所知,所以这可能不是你要搜索的内容,但对于简单的数据结构,你总是可以得到read:
data Test a = I Int | S a deriving (Read,Show)
现在,为了表达
read "S 123" :: Test Double
GHCi将排放:S 123.0
对于任何更复杂的事情,您可以使用Parsec创建Read实例。
目前(afaik)没有相当于Haskell中的Construct。
可以使用Template Haskell实现一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.