Haskell 中的固定大小数组
Fixed size arrays in Haskell
我正在尝试为 Haskell 中的线性代数运算编写一个库。为了能够为矩阵和向量定义安全操作,我想在它们的类型中对它们的维度进行编码。经过一些研究,我发现使用 DataKinds 可以做到这一点,类似于它的完成方式 here。例如:
data Vector (n :: Nat) a
dot :: Num a => Vector n a -> Vector n a -> a
在上述文章以及一些库中,向量的大小是幻像类型,向量类型本身是数组的包装器。在试图弄清楚标准库中是否存在类型级别大小的数组类型时,我开始想知道数组的底层表示形式。根据我在 GHC 内存布局上收集到的 this commentary 表格,数组需要将它们的大小存储在堆上,因此 3 维向量需要占用比必要的多 1 个字。当然我们可以使用下面的定义:
data Vector3 a = Vector3 a a a
如果我们只关心 3D 几何,这可能没问题,但它不允许任意大小的向量,而且它会使索引变得笨拙。
所以,我的问题是这样的。在标准库中拥有一个静态已知大小的数组类型不是很有用和潜在的内存优化吗?据我所知,它唯一需要的是一个不同的信息 table,它将存储大小,而不是将其存储在每个堆对象中。此外,编译器可以自动在 Array 和 SmallArray 之间进行选择。
Wouldn't it be useful and a potential memory optimization to have an array type with statically known size in the standard library?
当然可以。我怀疑如果你仔细编写你的用例并实施它,GHC HQ 会接受一个补丁。不过,您可能想先写文章,然后 double-check 他们会参与其中,以避免在他们不接受的补丁上浪费时间;我当然不代表他们。
Also, the compiler could choose between Array and SmallArray automatically.
我不是这方面的专家,但我有点怀疑这一点。通常支持多态意味着你需要一个统一的表示。
我正在尝试为 Haskell 中的线性代数运算编写一个库。为了能够为矩阵和向量定义安全操作,我想在它们的类型中对它们的维度进行编码。经过一些研究,我发现使用 DataKinds 可以做到这一点,类似于它的完成方式 here。例如:
data Vector (n :: Nat) a
dot :: Num a => Vector n a -> Vector n a -> a
在上述文章以及一些库中,向量的大小是幻像类型,向量类型本身是数组的包装器。在试图弄清楚标准库中是否存在类型级别大小的数组类型时,我开始想知道数组的底层表示形式。根据我在 GHC 内存布局上收集到的 this commentary 表格,数组需要将它们的大小存储在堆上,因此 3 维向量需要占用比必要的多 1 个字。当然我们可以使用下面的定义:
data Vector3 a = Vector3 a a a
如果我们只关心 3D 几何,这可能没问题,但它不允许任意大小的向量,而且它会使索引变得笨拙。
所以,我的问题是这样的。在标准库中拥有一个静态已知大小的数组类型不是很有用和潜在的内存优化吗?据我所知,它唯一需要的是一个不同的信息 table,它将存储大小,而不是将其存储在每个堆对象中。此外,编译器可以自动在 Array 和 SmallArray 之间进行选择。
Wouldn't it be useful and a potential memory optimization to have an array type with statically known size in the standard library?
当然可以。我怀疑如果你仔细编写你的用例并实施它,GHC HQ 会接受一个补丁。不过,您可能想先写文章,然后 double-check 他们会参与其中,以避免在他们不接受的补丁上浪费时间;我当然不代表他们。
Also, the compiler could choose between Array and SmallArray automatically.
我不是这方面的专家,但我有点怀疑这一点。通常支持多态意味着你需要一个统一的表示。