Haskell中固定大小的数组



我试图用Haskell写一个线性代数操作库。为了能够定义矩阵和向量的安全操作,我想用它们的类型来编码它们的维数。经过一些研究,我发现使用DataKinds可以做到这一点,类似于这里的方法。例如:

data Vector (n :: Nat) a
dot :: Num a => Vector n a -> Vector n a -> a

在前面的文章中,以及在一些库中,向量的大小是一个幻影类型,而向量类型本身是数组的包装。在试图找出是否有一个数组类型与它的大小在标准库的类型级别,我开始想知道数组的底层表示。从我对GHC内存布局的评论中收集到的信息来看,数组需要将它们的大小存储在堆上,因此三维向量需要比必要的多占用1个单词。当然,我们可以使用下面的定义:

data Vector3 a = Vector3 a a a

如果我们只关心三维几何,这可能是好的,但它不允许任意大小的向量,而且它使索引变得尴尬。

我的问题是这样的。在标准库中拥有一个静态大小已知的数组类型,这难道不是一种有用且潜在的内存优化吗?到目前为止,据我所知,它唯一需要的是一个不同的信息表,它将存储大小,而不是存储在每个堆对象。此外,编译器可以在Array和SmallArray之间自动选择。

在标准库中拥有一个静态已知大小的数组类型不是很有用吗?

确定。我怀疑如果你仔细地写下你的用例并实现它,GHC HQ会接受一个补丁。你可能需要先写一份书面报告,并仔细检查他们是否投入其中,以避免在他们不接受的补丁上浪费时间;我当然不代表他们。

同时,编译器可以在Array和SmallArray之间自动选择。

我不是这方面的专家,但我有点怀疑这一点。通常支持多态性意味着你需要一个统一的表示。

最新更新