0

1 つの値が MVar であるレコードがあるとします。

data SomeRecord = SomeRecord { frobs :: MVar Integer }

Aesonを使用してJSONからエンコード/デコードできるようにしたいと考えています。エンコーディング時には、MVar がアンラップされ、生の値がエンコードされ、デコーディング時にはその逆が発生します。

IO (Maybe SomeRecord)を返すFromJSONインスタンスと を返す ToJSON インスタンスを書けるようになればいいのですがIO ByteString、Parser モナドは MonadIO のインスタンスではないので、それは不可能だと思います。

これまでのところ、MVar によって妨げられたレコードと MVar 型のないほぼ同一のレコードとの間で変換する関数を作成し、それをエンコード/デコードすることに頼ってきました。

そもそも MVar を自分の記録から除外する方法を見つけようとしました。それが理想になりそうです。しかし、何らかの理由でそれができないと仮定すると、JSON のエンコード/デコードを処理する簡単な方法はありますか?

編集:

私は間違った質問をしているのだろうか。たぶん、私のアプローチ全体が間違っています。私がやろうとしているのは、接続された多数のクライアント (それぞれが異なるスレッド上) がオブジェクトのリストを追加/編集/削除できるようにすることです。タイプは次のようになります。

-- the data type for each "room"
data Instance = Instance 
    { iName    :: T.Text
    , iObjects :: M.HashMap T.Text (MVar Store)
    ...
    }

-- the data type for a particular object in the room that can be changed
data Store = Store
    { sObject :: A.Value
    ...
    }

各「部屋」には、Instanceその部屋のオブジェクトを保持する があります。インスタンス自体は、ハッシュマップの追加/削除を同期するために MVar にiObjectsあり、個々のストアは MVar にあるため、個々のオブジェクトが更新されている間、データ構造全体がブロックされる必要はありません。

したがって、更新操作は次のように進行します。

  • iObjects ハッシュを取得するためのインスタンスの readMVar
  • M.特定の店舗を検索する
  • 更新を行うためのストアの modifyMVar

このようにネストされた MVar を使用するよりも慣用的な haskell アプローチはありますか? 理想的には、MVar をデータから遠ざける何らかの方法で、構造全体を永続化するのが簡単になります。

4

2 に答える 2

5

いいえ、純粋なデータ構造に埋め込まれた同時実行プリミティブがあります。それは常に扱いにくいものです。MVar に触れようとするものに副作用をこっそり持ち込んでいます。

整数のコンテナーによってデータ型をパラメーター化してみてください。例えば

data T a = T { frobs :: c Integer }

次に、インスタンス化された で作業しT MVar、ストリーミングの場合はラップを解除し、 として操作できT Oneますdata One a = One a

于 2012-12-07T19:08:23.570 に答える
0

FromJSON および ToJSON 型クラスは、解析/出力コードを作成する際に便利です。それらがなくても、パーサーとプリンターを作成することはできますが、ボイラープレートがさらに必要になるだけです。お気づきのように、これらの型クラスは、不純な値で機能するようには定式化されていません。したがって、基本的に、他のアプローチとそれに付随する余分なボイラープレートに固執しています。

それをより良くするためのいくつかのオプションがあります。FromJSON と ToJSON をコピーして変更し、モナディック IO を使用するパーサーとプリンターをサポートすることができます。このパターンを頻繁に使用する場合は、それだけの価値があるかもしれません。または、unsafePerformIO を使用することもできますが、それは非常に悪い考えのように思えます...何をしているのか正確にわからない場合、大きな問題を簡単に引き起こす可能性があるため、言及する価値さえないかもしれません。

そしてもちろん、あなたが言及したように、構造を純粋にしようとすることもできます。それが私にとって最良のアプローチのようです。MVars を持つ別の構造と、不純な構造から純粋な構造を取り込む関数を持つことができます。このように、純粋な構造は可変構造の JSON 解析/出力を容易にするパスとして機能します。

于 2012-12-07T19:06:45.503 に答える