【发布时间】:2013-01-26 12:05:46
【问题描述】:
在 Haskell 中,如果您有一个“族”类型(例如,N 乘 N 元素矩阵,对于 N 的某些值),以及“相关”类型的并行族(例如,N 元素向量,对于相同的 N 值),以及需要每个族中的一个特定类型的操作(例如,将 N 乘 N 元素矩阵和 N 元素列向量相乘),那么是否可以声明一个类型该操作的类?
对于这个具体的例子,我想它看起来像这样:
class MatrixNxN m where
--| Multiplication of two N-by-N-element matrices
mmul :: Num a => m a -> m a -> m a
--| Multiplication of an N-by-N-element matrix and an N-element column vector
vmul :: Num a => m a -> v a -> v a
但是,我不知道如何约束 v 类型。有可能做这样的事情吗?
请注意,我欢迎对声明多个相关类型的类型类的一般问题的回答,以及对为矩阵向量乘法声明类型类的具体问题的回答。在我的具体情况下,只有一小部分已知的 N 值(2、3 和 4),但我通常有兴趣了解在 Haskell 的类型系统中可以编码的内容。
编辑:我使用MultiParamTypeClasses 和FunctionalDependencies 实现了这一点,如下面的Gabriel Gonzalez 和MFlamer 所建议的那样。这就是我实现的相关部分最终的样子:
class MatrixVectorMultiplication m v | m -> v, v -> m where
vmul :: Num a => m a -> v a -> v a
data Matrix3x3 a = ...
data Vector3 a = ...
instance MatrixVectorMultiplication Matrix3x3 Vector3 where
vmul = ...
这是vmul 的类型签名,单独使用并部分应用:
vmul :: (Num a, MatrixVectorMultiplication m v) => m a -> v a -> v a
(`vmul` v) :: Matrix3x3 Integer -> Vector3 Integer
(m `vmul`) :: Vector3 Integer -> Vector3 Integer
我觉得这一切都非常优雅。感谢您的回答! :)
【问题讨论】:
-
有趣的是,您会使用“family”这个词,因为“type family”扩展正是您正在寻找的。另请参阅“关联类型”。
-
您还需要说明您是否希望
m由v唯一确定。 -
@luqui 好吧,那怎么样。我会调查的。谢谢!
-
@GabrielGonzalez 是的,我的意图是,对于每种类型的 N 元素向量,将只有一种类型的 N×N 元素矩阵。
-
另一种可能性是使用
hmatrix库中Mul类型类的样式中的MultiParamTypeClasses和FunctionalDependencies。
标签: haskell typeclass functional-dependencies