さて、私は型クラスに頭を悩ませようとしているので、幾何学的ベクトル操作の型クラスを定義しようとしています。コンポーネントごとに機能させることができました+,-,*,/;
が、内積に苦労しています。
class GeomVector a where
(>+) :: a -> a -> a
(>-) :: a -> a -> a
(>*) :: a -> a -> a
(>/) :: a -> a -> a
(>.) :: a -> a -> Double
data Vector a = Vec [a]
deriving Show
instance (Fractional a) => GeomVector (Vector a) where
(>+) (Vec u) (Vec v) = Vec $ zipWith (+) u v
(>-) (Vec u) (Vec v) = Vec $ zipWith (-) u v
(>*) (Vec u) (Vec v) = Vec $ zipWith (*) u v
(>/) (Vec u) (Vec v) = Vec $ zipWith (/) u v
(>.) (Vec u) (Vec v) = sum $ u >* v
明らかに、 (>.) のインスタンス定義は機能しません。これは、結果の型Fractional a
が ではなくであるためDouble
です。
しかし、クラスの宣言からこの動作を取得する方法がわかりません。
私がやりたいことは次のとおりです。
class GeomVector [a] where
(>.) :: [a] -> [a] -> a
しかし、これは[a]
型変数ではなく型であるため無効です。
これをもう少しうまく説明できればいいのですが、正直なところ、そうするほど十分に理解できていません。このコードによって、私が何に苦労しているのかがもう少し明確になることを願っています。