0

我正在尝试与 forkIO 同时运行一些计算,并且在每个线程中我想编写一个 MongoDB Document。因为我希望在线程上实际完成计算,所以我想完全评估这个文档,所以我使用了 Strict MVars。

但是,当我尝试这个时,我得到

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 回答