3

多くの場合、文字列としての名前を介してレコード フィールドを設定/取得できると便利です(たとえば、レコードをコマンド ライン引数、HTTP ヘッダー、SQL クエリ結果との間で変換したり、ウィジェットを GUI ツリーに保存したりします)。使いやすい記録など)。関数は型を持つことができます

setField::String->Val->Record->Record
getField::String->Record->Val
getFieldNames::Record->[String]

ここで、Val は他の型 (string、glib GValue、またはここで説明した Convertables )に変換できるものである可能性があります。

私はこれを行うライブラリを書き始めました.コミュニティに貢献する計画があります..

私の質問 - このようなものはすでに存在しますか? 外部の名前/値のペアからレコードを作成するより良い方法はありますか? あちこち探しましたが見つかりません。(レンズは関連していますが、文字列名は使用しないでください)。

これは便利だと思いますが、車輪の再発明はしたくありません。

4

1 に答える 1

3

を使用してこのようなことを行うことVinylもできますが、厳密な型のアクセサーを作成する必要があります。利点は、型システムに十分な情報が含まれているため、ランタイムでラップされたMaybeルックアップの失敗を処理する必要がないことです。

そのリンクからいくつかの関連する例をコピーする

name     = Field :: "name"     ::: String
age      = Field :: "age"      ::: Int
sleeping = Field :: "sleeping" ::: Bool


jon = name =: "jon"
  <+> age =: 20
  <+> sleeping =: True

type LifeForm = ["name" ::: String, "age" ::: Int, "sleeping" ::: Bool]

jon :: PlainRec LifeForm

wakeUp :: (("sleeping" ::: Bool) ∈ fields) => PlainRec fields -> PlainRec fields
wakeUp = sleeping `rPut` False

jon' = wakeUp jon

> rGet name jon'
"jon"
> rGet sleeping jon
True
> rGet sleeping jon'
False

これに似たようなことをしたくない場合は、おそらくある種の実行時障害が発生する可能性がありますtype Record = Map String Val

于 2013-11-06T23:28:02.810 に答える