在 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
但是,我不知道如何限制 type 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
我觉得这一切都非常优雅。感谢您的回答!:)