2013-06-24 47 views
2

我有以下形式的数据类型:部分装箱矢量

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

我能明显把这些成规则矢量从Data.Vector模块。但是,当我访问a组件时,我想要非常非常好的性能,所以额外的间接性是不理想的。我想要做的是让TData.Vector.Unboxed.Unbox的一个实例,但仍然有b为懒惰。

vector-th-unbox提供制作Unbox情况下,一个漂亮的模板哈斯克尔接口,但它不会在我的情况下工作。它要求为了使TUnbox的实例,ab也必须是实例。但我不想取消箱b。我希望它被装箱/懒惰。

我的直觉说,为了克服这一障碍的最简单的方法是通过提供一种

newtype LazyUnbox a = LazyUnbox a 

然后,我需要为LazyUnbox将基本上只是存储拆箱载体内的指针提供Unbox实例。我怎样才能做到这一点?还是有更好的方法?

+0

“可存储”向量与“无箱”向量具有同样好的性能和严格性能,所以如果你可以让你的数据类型为'T'实现'可存储',那么你就很好。 –

回答

10

你如何想象“将指针存储为unbox”(即机器字)值?就我所知,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