我有以下形式的数据类型:
data T = { a :: Int, b :: ComplexOtherDataType }
我显然可以将这些放入
Data.Vector
模块中的常规向量中。但是当我访问 a
组件时,我想要非常非常好的性能,所以额外的间接性是不可取的。我想要做的是让 T
成为 Data.Vector.Unboxed.Unbox
的一个实例,但仍然让 b
变得懒惰。vector-th-unbox
为创建 Unbox
的实例提供了一个很好的模板haskell 接口(interface),但在我的情况下它不起作用。它要求为了使 T
成为 Unbox
的实例,a
和 b
也必须是实例。但我不想拆箱 b
。我希望它被装箱/懒惰。我的直觉是克服这个障碍的最简单方法是提供一个类型
newtype LazyUnbox a = LazyUnbox a
然后,我需要为
Unbox
提供一个 LazyUnbox
实例,它基本上只在未装箱的向量中存储一个指针。我怎样才能做到这一点?还是完全有更好的方法? 最佳答案
您如何想象“将指针存储为拆箱”(即机器字)值?据我所知,GHC 运行时不允许获取指向托管结构的指针。
权衡解决方案是制作您自己的 VG.Vector
实例,例如。
data TVector = TVector (VU.Vector Int) (V.Vector ComplexOtherDataType)
instance VG.Vector TVector T where
basicUnsafeIndexM (TVector va vb) i = do
a <- basicUnsafeIndexM va i
b <- basicUnsafeIndexM vb i
return (T a b)
...
您可以在需要时提取未装箱的部分
VU.Vector Int
。关于haskell - 部分未装箱的向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17267413/