Haskell相当于Python的“构造”

时间:2009-08-03 23:05:16

标签: python parsing haskell dsl 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和Haskell这样的工具 我想知道这样的事情是否存在。

我知道:

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

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

3 个答案:

答案 0 :(得分:1)

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

Data.Binary(惊喜!)会帮助您处理二进制数据,包括读写。 您可以编写代码来自行读/写,也可以使用DrIFTDerive之类的其他工具释放详细信息并为数据结构生成所需的代码。 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实现一个。