2013-03-04 12 views
7

私はWarp(そしておそらくScotty)と酸性状態のHaskellでかなり単純なCRUD Webサービスを作っています。部分的なjsonオブジェクトをhaskellのaesonで解析する

酸性状態では、ユーザーレコードをData.Mapに保存します(例:this)。私は、それらの記録は常に創造時に完全であることを知っているので、私は多くのMaybeSで資格を取る必要はありません。しかし、ユーザを更新するとき、クライアントは部分的なjsonオブジェクトを送信することを選択することができます。

これを表現するための慣習的な方法は何でしょうか? 1つのデータ宣言、つまりMaybeSを持たないFullUserと、オプションのすべてのキーPartialUserの前にMaybeSとまったく同じものを入れて、aesonが自動的にencodeとdecodeを派生させ、最後に自分のタイプの更新関数を書いてください。 FullUser - > PartialUser - > FullUser?

これはあまりコードはありませんが、少し醜いと感じ、DRYに少し違反しているようです。それはWebサーバでのそのような共通の作業でなければならないかもしれません。おそらくそれはおそらく既にTHで一般的に解決されていますか?

私はちょうどjsonの文字列を保存し、キーが見つからない場合があることを認識していますが、スキーマの変更についてはやや不器用ですが、将来的には証明しますが、 "方法。

EDIT: また、FullUserとjson文字列から簡単な更新機能を作成するには、FullUserとaeson-lensだけを使用してください。

答えて

7

イディオム・ハスケルはできるだけ多くの静的検査を行っています。動的チェックを静的チェックと置き換えることが可能かどうかという観点から、常に問題にアプローチする必要があります。これは本質的に、Haskellについての現実に近い次のような声明を出しています。「コンパイルすればうまくいく」だから間違いなく、 "いいえ"プレーンJSONで作業する。

FullUserPartialUserの解は正しいです。 UserUserJSONという別の命名方法を使用することをお勧めしますが、この方法ではかなり説明的で合理的な意味が得られます。

しかし、Aesonには小さな問題があります。生成されたインスタンスdon't yet support parsing missing fields(問題に投票してください)。インスタンスを手動で定義する必要があります。

+0

入力いただきありがとうございます。ええ、命名は質問をより明確にすることでした。この場合、生成されたインスタンスでは不十分なので、FullUserとjsonの文字列を取り、それを更新するためにaeson-lens(おそらくFullUserのレンズ)を使用する更新関数を使用します。 – Gurgeh

関連する問題