2012-01-23 4 views
3

私のような記録のための部分的な更新を承知している:素敵なレコードハスケルのトリックを扱いますか?

data A a b = A { a :: a, b :: b } 
x = A { a=1,b=2 :: Int } 
y = x { b = toRational (a x) + 4.5 } 

は、部分的にしか初期化を行うサブレコードタイプを作成、またはサブレコードに(デ)シリアライズを行うための任意のトリックはありますか?

は特に、私は、これらの行の最初の作品が、2番目にはないことが判明:

read "A {a=1,b=()}" :: A Int() 
read "A {a=1}" :: A Int() 

あなたは常に正規表現を使用して、このような入力をマッサージできますが、私は好奇心が強いHaskellのようなものをオプション存在する。

+0

私はあなたがここで何を求めているのかよく分かりません。 'A {a = 1}'を解析できる一般的なデシリアライゼーションメカニズム?私はHaskell 'Show'フォーマットのデータを実際に格納することはお勧めしません。それは全くコンパクトではなく、ハスケル以外のものでそれを解析することは苦痛になるでしょう。 – ehird

答えて

5

部分的な初期化が正常に機能します。A {a=1}は、タイプA Int()の有効な式です。 Readインスタンスは、Showインスタンスが出力しないものを解析するだけで済みます。 bフィールドはerror "..."に初期化されます。この文字列には、デバッグに役立つファイル/回線情報が含まれています。

現実世界の解析状況には、通常、Readを使用しないでください。それは本当にシンプルなシリアライゼーションのニーズとデバッグを持つおもちゃプログラムのためのものです。

「サブレコード」の意味が分かりませんが、レコードフォーマットに「アップグレード」してより多くの情報を格納できるようにしながら、まだ古いものを処理できるシリアル化/デシリアライゼーションが必要な場合は")のシリアル化を行うと、safecopyライブラリだけで動作します。

+0

ああ、私は単にあなたが1つを作るときに起こる警告と、ショーがスローするという例外を過ぎていない。そして、はいsafecopyは面白い、ありがとう! –

0

ハスケルの値を "初期化されていない"ままにすることはできません(ハスケルは純粋なので、あとで "初期化"することはできません)。フィールドに「デフォルト」の値を指定する場合は、レコードタイプの「デフォルト」値を作成し、そのデフォルト値を部分的に更新して、重要なフィールドのみを設定することができます。私はあなたがこれを簡単な方法でどのように実装するのか分かりません。

関連する問題