好吧,我正试图围绕typeclasses打包头,所以我试图为几何向量操作定义一个typeclass。我设法让它在组件方面工作+,-,*,/;
,但我正在努力与点产品。Haskell向量类型:函数[a] - > [a] - > a
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]
是一个类型,而不是一个类型变量。
我希望我可以更好地解释这一点,但我老实说不够了解。希望代码能够让我更加明白我正在努力挣扎的东西。
我想你需要另一个类型变量来表示标量的类型,即'class GeomVector a s where ...(>。):: a - > a - > s'。 – ErikR
你想要的是[关联类型同义词](http://www.haskell.org/haskellwiki/GHC/Type_families#An_associated_type_synonym_example) – Lambdageek
您的类声明不仅因为(>。)结果类型而存在缺陷。 您试图生成''''u'''和''v'''的点积,它们是 列表,而不是您班级的实例。 –