Haskellでは、型の「ファミリ」(たとえば、Nの一部の値の場合はN行N要素の行列)と、「関連する」型の並列ファミリ(たとえば、NのN要素ベクトル)がある場合Nの同じ値)、および各ファミリから1つの特定の型を必要とする操作(たとえば、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
て、以下のGabrielGonzalezと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
これはすべてとてもエレガントだと思います。答えてくれてありがとう!:)