簡體   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