3

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 を使用する必要があると思いますか?

4

3 に答える 3

1

それはあなたが何をしたいのか、そしてあなたが既存のフォーマットに準拠する必要があるのか​​どうかに依存すると思います。

Data.Binaryは(驚きです!)読み取りと書き込みの両方のバイナリデータを支援します。コードを記述して自分で読み取り/書き込みを行うか、DrIFTDeriveなどの追加ツールを使用して、詳細を手放し、データ構造に必要なコードを生成することができます。DrIFTはプリプロセッサとして機能しますが、DeriveはプリプロセッサおよびTemplateHaskellとして機能します。

Parsecは、テキストの解析のみを支援します。バイナリデータ(簡単に)も書き込みもありません。作業は通常Stringので行われます。ハッキングにはByteString同等のものがあります。

上記の例では、Data.Binaryを使用して、自分でカスタムput/ getersを記述します。その他のオプションについては、hackageのパーサーカテゴリをご覧ください。

于 2009-08-04T14:21:23.470 に答える
-1

私は Python や Construct について何も知らないので、これはおそらくあなたが探しているものではありませんが、単純なデータ構造の場合は、いつでも読み取りを派生させることができます:

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

さて、表現ですが

read "S 123" :: Test Double

GHCi が放出する: S 123.0

もっと複雑な場合は、Parsec を使用して Read のインスタンスを作成できます。

于 2009-08-04T01:09:45.577 に答える