質問

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のインスタンスを作成できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top