【发布时间】:2012-12-07 10:30:28
【问题描述】:
我有以下 Haskell 类型定义:
import Data.Sequence(Seq, length)
import Data.ByteString.UTF8(ByteString)
type StringSeq = Seq ByteString
我有StringSeq 类型的表达式,我想强制使用deepseq 进行严格评估。所以我需要定义NFData 的实例。我做了以下事情:
import Control.DeepSeq(NFData, deepseq)
instance NFData ByteString
instance NFData a => NFData (Seq a) where
rnf s = rnf (length s)
所以我计算一个序列的长度来强制对序列本身进行评估。这似乎可行,但这是正确的实现吗?有更好的吗?计算一个序列的长度会不会引入太多的开销?
【问题讨论】:
-
计算
Seq的长度不会有任何用处,因为Seq已经是spine-strict。它肯定不是一个有效的NFData实例,因为它甚至不会尝试强制Seq的内容。此外,NFData实际上不太可能是您想要的。你真正想做的是什么?deepseq通常对于获得正确的严格行为(和性能)来说“太多,太迟了”。 -
除了shachaf所说的,已经有一个
NFData实例:instance NFData a => NFData (Seq a) where rnf (Seq xs) = rnf xs。 (arrh,仅在 7.6.1 附带的containers中,不适用于早期版本) -
但是,在将它们放入
Seq之前,您所要做的就是seq和ByteStrings。由于Seq的脊椎严格,这确保了完整的评估。 -
@Daniel Fischer:但
Seq是函数的结果:返回Seq的函数应用程序也必须进行评估。我必须检查seq这里是否足够,也许不是?
标签: haskell sequence strict bytestring