代码之家  ›  专栏  ›  技术社区  ›  yairchu

haskell相当于python的“construct”

  •  3
  • yairchu  · 技术社区  · 15 年前

    Construct 是用Python实现的DSL,用于描述数据结构(二进制和文本)。一旦描述了数据结构,构造就可以为您解析和构建它。哪个是好的(“干的”、“陈述的”、“表示语义”…)

    使用实例:

    # 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来实现这一点?

    3 回复  |  直到 11 年前
        1
  •  1
  •   L. Kolmodin    15 年前

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

    Data.Binary 威尔(惊喜!)帮助您处理二进制数据,包括读写。 您可以编写代码来读/写自己,或者使用其他一些工具,比如 DrIFT Derive . 漂移作为预处理器工作,而派生可以作为预处理器和TemplateHaskell工作。

    Parsec 只会帮助您解析文本。没有二进制数据(很容易),也没有写。定期完成工作 String 那里有 ByteString 黑客时代的等价物。

    对于上面的示例,我将使用data.binary和write-custom put / get 我自己。 看看 parser category at hackage 更多选项。

        2
  •  0
  •   fishlips    15 年前

    我对python或construction一无所知,因此这可能不是您要搜索的内容,而是对于简单的数据结构,您总是可以从中派生read:

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

    现在,为了表达

    read "S 123" :: Test Double
    

    GHCI将发出:S 123.0

    对于更复杂的内容,可以使用parsec创建一个read实例。

        3
  •  0
  •   yairchu    15 年前

    目前(afaik)在haskell中没有等效的构造。

    一个可以使用模板haskell实现。