好吧,我正在尝试围绕类型类进行思考,因此我正在尝试为几何向量操作定义一个类型类。我设法让它在组件方面工作,+,-,*,/;
但我在点积上苦苦挣扎。
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
显然,我对 (>.) 的实例定义不起作用,因为结果是 type Fractional a
,而不是Double
。
但我不知道如何从类中的声明中获得这种行为。
我想做的是:
class GeomVector [a] where
(>.) :: [a] -> [a] -> a
但这是无效的,因为[a]
是类型而不是类型变量。
我希望我能更好地解释这一点,但老实说,我理解得还不够。希望该代码将使我正在努力解决的问题更加明显。