我有以下形式的数据类型:

data T = { a :: Int, b :: ComplexOtherDataType }

我显然可以将这些放入 Data.Vector 模块中的常规向量中。但是当我访问 a 组件时,我想要非常非常好的性能,所以额外的间接性是不可取的。我想要做的是让 T 成为 Data.Vector.Unboxed.Unbox 的一个实例,但仍然让 b 变得懒惰。
vector-th-unbox 为创建 Unbox 的实例提供了一个很好的模板haskell 接口(interface),但在我的情况下它不起作用。它要求为了使 T 成为 Unbox 的实例,ab 也必须是实例。但我不想拆箱 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/

10-11 16:13