我正在学习Haskell,并阅读了几篇关于Haskell列表和(插入语言)数组的性能差异的文章.
作为一个学习者,我显然只是在不考虑性能差异的情况下使用列表.我最近开始调查,发现Haskell中有许多数据结构库.
有人可以解释一下列表,数组,向量,序列之间的区别,而不是深入研究数据结构的计算机科学理论吗?
此外,是否有一些常见的模式,您将使用一个数据结构而不是另一个?
是否有任何其他形式的数据结构我缺少并可能有用?
我有一个10GB Data.Vector.Unboxed向量,我想有效地保存到磁盘.什么是最好,最有效的方式?我打算从内存映射文件中读取它.
我已经看过这个包这个包但只适用于Storable,但我需要保持unboxed.
我在考虑转换到列表,但我认为这不是很理想.
所以...我已经使用了未装箱的载体(来自vector包装),现在最好不要考虑太多.vector-th-unbox为他们创建实例变得轻而易举,为什么不呢.
现在我遇到了一个实例,我无法自动派生那些实例,一个带有幻像类型参数的数据类型(如Vector (s :: Nat) a,s编码长度).
这让我想到了Storable和Unboxed矢量之间的差异.我自己想出的事情:
Unboxed 将元组存储为单独的向量,从而导致更好的高速缓存局部性,而不需要在仅需要其中一个值时浪费带宽.Storable仍将编译为简单(可能有效)的readArray#s,返回未装箱的值(通过阅读核心显而易见).Storable允许直接指针访问,允许与外部代码的互操作性.Unboxed没有.Storable实例实际上是更容易用手比写Unbox(即Vector和MVector)的.仅仅这一点并没有让我明白为什么Unboxed即使存在,似乎也没什么好处.可能我错过了那里的东西?