Pythonの「構築」に相当するHaskell
質問
Construct は、データ構造(バイナリおよびテキスト)を記述するために使用されるPythonで実装されたDSLです。データ構造を記述したら、constructはそれを解析して構築できます。どちらが良いか(「DRY」、「宣言的」、「表示的意味論」...)
使用例:
# 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:解析専用ですか?テキストのみですか?
これを実現するには、テンプレートHaskellを使用する必要があると思いますか?
解決 3
現在(afaik)HaskellにはConstructと同等のものはありません。
テンプレートHaskellを使用して実装できます。
他のヒント
やりたいことや、既存のフォーマットに準拠する必要があるかどうかに依存すると思います。
Data.Binary は、バイナリデータの読み取りと読み取りの両方を支援します(驚き!)書き込み。 自分で読み書きするコードを書くか、詳細を手放して DrIFT または派生。 DrIFTはプリプロセッサとして機能し、Deriveはプリプロセッサとして機能し、TemplateHaskellで機能します。
Parsec は、テキストの解析にのみ役立ちます。バイナリデータなし(簡単に)、書き込みなし。作業は通常の String
で行われます。ハッキングには ByteString
に相当するものがあります。
上記の例では、Data.Binaryを使用して、カスタムの put
/ get
ersを自分で作成します。
hackageのパーサーカテゴリをご覧くださいその他のオプション。
PythonやConstructについて何も知らないので、これはおそらくあなたが探しているものではありませんが、単純なデータ構造の場合は、常に読み取りを導き出すことができます:
data Test a = I Int | S a deriving (Read,Show)
今、式について
read "S 123" :: Test Double
GHCiが放出します:S 123.0
より複雑なものについては、Parsecを使用してReadのインスタンスを作成できます。