所以...我已经使用了未装箱的载体(来自vector包装),现在最好不要考虑太多.vector-th-unbox为他们创建实例变得轻而易举,为什么不呢.
现在我遇到了一个实例,我无法自动派生那些实例,一个带有幻像类型参数的数据类型(如Vector (s :: Nat) a,s编码长度).
这让我想到了Storable和Unboxed矢量之间的差异.我自己想出的事情:
Unboxed 将元组存储为单独的向量,从而导致更好的高速缓存局部性,而不需要在仅需要其中一个值时浪费带宽.Storable仍将编译为简单(可能有效)的readArray#s,返回未装箱的值(通过阅读核心显而易见).Storable允许直接指针访问,允许与外部代码的互操作性.Unboxed没有.Storable实例实际上是更容易用手比写Unbox(即Vector和MVector)的.仅仅这一点并没有让我明白为什么Unboxed即使存在,似乎也没什么好处.可能我错过了那里的东西?
在源modify就被指出该操作将在地方,如果它是安全的话来进行,并会以其他方式修改载体的拷贝.
但是看代码modify:
modify :: Vector v a => (forall s. Mutable v s a -> ST s ()) -> v a -> v a
modify p = new . New.modify p . clone
Run Code Online (Sandbox Code Playgroud)
它看起来clone总是被调用(这对我来说很有意义,因为我认为它必须是对不可变向量的破坏性操作).
我误解了吗?如果没有,那么什么是clone未调用的示例,以及如何Data.Vector完成旁路?
当我尝试这个:
import GHC.Generics (Generic)
import Control.DeepSeq (NFData(..))
import Data.Vector.Generic (Vector)
data Entry a = Entry !Bool a
deriving (Generic, NFData)
-- The variable @v@ is meant to be instantiated with a 'Vector'
-- type. Most operations for the type have a @Vector v (Entry a)@
-- constraint.
newtype DenseIntMap v a = DenseIntMap (v (Entry a))
instance NFData (v (Entry a)) => NFData (DenseIntMap v a) where
rnf (DenseIntMap va) = rnf va
Run Code Online (Sandbox Code Playgroud)
...我收到此错误:
/Users/casillas/GitHub/tau-sigma/src/TauSigma/Util/DenseIntMap.hs:53:10:
Constraint is no smaller than …Run Code Online (Sandbox Code Playgroud)