繁体   English   中英

Haskell相当于Python的“构造”

[英]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这样的工具,我想知道这样的事情是否存在。

我知道:

  • Data.Binary:用户单独实现解析和构建
  • Parsec:仅用于解析? 仅限文字?

我想必须使用Template Haskell来实现这一目标吗?

我会说这取决于你想做什么,以及你是否需要遵守任何现有的格式。

Data.Binary将(惊喜!)帮助您读取和写入二进制数据。 您可以编写代码来自行读/写,也可以使用DrIFTDerive等其他工具释放详细信息并为数据结构生成所需的代码。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM