如何使用Linear.V编写静态类型检查矩阵运算(Haskell)?

时间:2015-01-21 13:12:16

标签: haskell types existential-type

我有兴趣使用Linear library中的Linear.V来编写对编译时已知大小的矩阵运算。但是,我不确定如何使用此库。我在哪里可以找到更多关于如何使用它的参考资料?

1 个答案:

答案 0 :(得分:3)

如果没有更多关于你想做什么的知识,这有点棘手,但我会采取刺激措施。 Linear.V为任何 n 提供 n 维度向量。在linear中,矩阵被定义为向量矢量 - Linear.Matrix定义了对这些值的操作。 Linear.Matrix通过在两个仿函数上进行参数化,可以处理各种大小的矩阵,而Linear.V确实是Functor,因此我们可以使用这些操作。

以下无聊的示例显示了如何使用Linear.V

{-# LANGUAGE DataKinds #-}
import Linear
import Linear.V
import Data.Vector

identity :: V 2 (V 2 Float)
identity = V (fromList [ V (fromList [1, 0]), V (fromList [0, 1]) ])

calculation :: V 2 (V 2 Float)
calculation = identity !*! identity

它很无聊,因为它只是计算两个身份矩阵的乘积,但它应该让你知道如何把这些碎片组合在一起。我使用GHC 7.6+类型文字来指定identity 2x2 矩阵。

请注意,使用V构造函数有点危险 - 它允许您“欺骗”#34;关于矢量的大小。例如,如果您执行以下操作:

identity :: V 2 (V 2 Float)
identity = V (fromList [ V (fromList [1, 0]) ])

事情很可能非常错误。使用fromVector更安全,或者tabulatetabulate使用V的表示 - 这基本上是从元素索引到其值的函数)。