Illegal instance declaraion when using tuples
Messing around in Haskell getting to know type classes more intimately, but I've hit a bit of a roadblock. For whatever reason I'm not allowed to make an instance of my Vector
class. I'm being told that it's an illegal instance declaration because I don't have distinct type variables? What's going on here?
class Vector v where
vplus :: v -> v -> v
vmult :: Num a => v -> a -> v
instance Num a => Vector (a, a) where
(a, b) `vplus` (c, d) = (a + c, b + d)
(a, b) `vmult` m = (a * m, b * m)
a
in you (a,a)
instance will be one arbitrary Num
instance. The a
in vmult :: Num a => v -> a -> v
knows nothing about this, ie this may be any other Num
instance.
To make the class work you need to either
ensure that the number types can be converted into each other. For instance,
class Vector v where
vplus :: v -> v -> v
vmult :: RealFrac a => v -> a -> v
instance RealFrac a => Vector (a, a) where
(a, b) `vplus` (c, d) = (a + c, b + d)
(a, b) `vmult` m' = (a * m, b * m)
where m = realToFrac m'
make sure the scalar multiplicators are actually the same type as the vector components. This is how the vector-space library does it. For your code, it would take on the form
{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
class Vector v where
type Scalar v :: *
vplus :: v -> v -> v
vmult :: v -> Scalar v -> v
instance Num a => Vector (a, a) where
type Scalar (a,a) = a
(a, b) `vplus` (c, d) = (a + c, b + d)
(a, b) `vmult` m = (a * m, b * m)
下一篇: 使用元组时非法实例声明