[英]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這樣的工具,我想知道這樣的事情是否存在。
我知道:
我想必須使用Template Haskell來實現這一目標嗎?
我會說這取決於你想做什么,以及你是否需要遵守任何現有的格式。
Data.Binary將(驚喜!)幫助您讀取和寫入二進制數據。 您可以編寫代碼來自行讀/寫,也可以使用DrIFT或Derive等其他工具釋放詳細信息並為數據結構生成所需的代碼。 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.