如何用Linear.V写静态类型校验矩阵运算(Haskell)?

How to use Linear.V to write static type checked matrix operations (Haskell)?

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

在不了解你到底想做什么的情况下问这个问题有点棘手,但我会试一试。 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 构造函数有些危险 - 它允许您 "lie" 关于向量的大小。例如,如果您执行以下操作:

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

事情可能会变得非常错误。使用 fromVectortabulate 更安全(tabulate 使用 V 的表示 - 这基本上是从元素索引到其值的函数)。