0

forkIO と同時にいくつかの計算を実行しようとしていますが、各スレッドで MongoDB Documentを書きたいと考えています。スレッド上で実際に計算を実行したいので、この Document を完全に評価したいので、Strict MVar を使用しています。

ただし、これを試していると、

No instance for (NFData Field)
  arising from a use of `putMVar'

つまり、これを評価するには、 Document のインスタンス宣言を追加する必要があると思います。

残念ながら、Document の構造は複雑なため、これを行う方法がわかりません。

私は一般的に NFData とそのインスタンスを作成する方法に慣れていないので、実際にこれを開始する方法はわかりません。

助けてくれてありがとう!

4

1 に答える 1

3

のインスタンスを書くのはNFDataそれほど難しいことではありませんが、複雑な構造を持つ型の場合、非常に繰り返しが多くなる可能性があります。あなたのDocumentタイプは のシノニムで[Field]あり、Control.DeepSeqすでにエクスポートinstance NFData a => NFData [a]しているので、本当に のインスタンスが必要ですField

このdeepseq-thパッケージを使用すると、Template Haskell を使用してインスタンスを自動的に派生させることができ、面倒な手間を省くことができます。

{-# LANGUAGE TemplateHaskell #-}

import Control.DeepSeq.TH

import Data.Bson

deriveNFData ''Field

そして、それはそれを行う必要があります。

于 2012-04-10T22:27:51.407 に答える