3

Construct是用 Python 实现的 DSL,用于描述数据结构(二进制和文本)。一旦你有了描述的数据结构,construct 就可以为你解析和构建它。哪个好(“DRY”、“Declarative”、“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 来实现这一点?

4

3 回答 3

1

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

Data.Binary将(惊喜!)帮助您处理二进制数据,包括读取和写入。您可以编写代码来自己读/写,或者放弃细节并使用一些额外的工具(如DrIFTDerive )为您的数据结构生成所需的代码。DrIFT 用作预处理器,而 Derive 可以用作预处理器并与 TemplateHaskell 一起使用。

Parsec只会帮助您解析文本。没有二进制数据(很容易),也没有写入。工作是用常规String的 s 完成的。ByteStringhackage有等价物。

对于上面的示例,我将使用 Data.Binary 并自己编写 custom put/ geters。查看hackage 的解析器类别以获取更多选项。

于 2009-08-04T14:21:23.470 回答
0

目前(afaik)没有等效于 Haskell 中的 Construct 。

一种可以使用 Template Haskell 来实现。

于 2009-08-28T12:26:29.033 回答
-1

我对 Python 或 Construct 一无所知,所以这可能不是您要搜索的内容,但对于简单的数据结构,您总是可以派生读取:

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

现在,对于表达式

read "S 123" :: Test Double

GHCi 将发出:S 123.0

对于更复杂的事情,您可以使用 Parsec 创建一个 Read 实例。

于 2009-08-04T01:09:45.577 回答