7

Warp (およびおそらく Scotty) と酸状態を使用して、Haskell でかなり単純な CRUD Web サービスを作成しています。

酸性状態では、User レコードを Data.Map に格納します (この例のように)。これらのレコードは作成時に常に完全であることを知っているので、多くの MaybeS で資格を得る必要はありません。ただし、ユーザーを更新する場合、クライアントは一部のフィールドのみが入力された部分的な json オブジェクトを送信することを選択する場合があります。

これを表現する慣用的な方法は何でしょうか? 1 つのデータ宣言、FullUser、MaybeS なし、およびすべてのオプションのキー、PartialUser の前に MaybeS とまったく同じものを用意し、aeson に後者のエンコードとデコードを自動的に導出させ、最終的にタイプ :: の独自の更新関数を作成する必要があります。 FullUser -> PartialUser -> FullUser?

大したコードではありませんが、少し見苦しく、DRY に少し違反しているように感じます。これは Web サーバーでは一般的なタスクであるはずなので、おそらく既に一般的に (おそらく TH で) 解決されているのではないでしょうか?

json文字列を保存するだけで不足しているキーを常にチェックできるため、少し面倒ですが、スキーマの変更に対する将来の証拠が増えますが、「タイプセーフ」な方法でそれを行う方法を知りたいです。

編集:または、おそらく FullUser のみを持ち、aeson-lens を使用して、FullUser と json 文字列から単純な更新関数を作成する必要がありますか?

4

1 に答える 1

8

慣用的な Haskell は、可能な限り多くの静的チェックを行っています。動的チェックを静的チェックに置き換えることが可能かどうかという観点から、常に問題に取り組む必要があります。これが本質的に、Haskell に関する次の声明を現実に非常に近づけている理由です。したがって、プレーンな JSON を操作することは間違いなく「いいえ」です。

FullUserとを使用したソリューションPartialUserは正しいです。私は別の命名アプローチを採用することをお勧めしますがUserUserJSONこの方法では、非常に説明的で合理的な意味が得られます。

ただし、Aeson には小さな問題があります。生成されたインスタンスは、欠落しているフィールドの解析をまだサポートしていません(問題に投票してください)。そのため、インスタンスを手動で定義する必要があります。

于 2013-03-04T21:21:02.723 に答える