为Trie创建一个NFData实例

时间:2017-09-23 15:58:03

标签: haskell

我目前正在使用vcache-trie模块开展项目。我想用lookupPrefix函数测试trie内部研究的执行速度。

这是为此目的使用Criterion创建的基准:

bench "trieSearch"  $ nf (lookupPrefix (pack "ab")) trie

其中trie是在标准环境中创建的。此trie的类型为Trie Int

当环境被评估为正常形式时,我需要为此特定类型创建NFData的实例。

这个特定情况的trie的内容是[(ByteString,Int)],我假设NFData的实例应该评估每个元组,但我不知道如何继续。

任何帮助都会非常感谢,感谢您花时间阅读我的问题。

2 个答案:

答案 0 :(得分:5)

以下应该可以解决问题,但可能效率低于编写NFData访问内部表示的效率(由@JonPurdy建议):

instance NFData a => NFData (Trie a) where rnf = rnf . toList

答案 1 :(得分:1)

理想情况下,您应该使用功能请求或补丁与vcache-trie的维护者联系以添加实例,因为您需要访问Trie的内部表示才能编写它。

作为一种变通方法,您可以创建包的本地修改版本(例如,在Stack中向extra-deps添加本地签出)并自行添加NFData实例,或者添加{{1转到deriving (Generic)并使用Trie来实现deepseq-generics