Haskell:非具体类型的Num实例

时间:2012-05-18 00:12:25

标签: haskell types instance typeclass

data Vector a = Vector a a a deriving (Eq, Show)

instance Functor Vector where
    fmap f (Vector x y z) = Vector (f x) (f y) (f z)

到目前为止一切顺利。

instance Num ((Num a) => Vector a) where
    negate = fmap negate

不起作用。我在第一行尝试了很多不同的变化,但GHC一直在抱怨。我想让 Vector包含数字 Num的实例;当然这应该是可能的吗?否则,我必须为IntIntegerFloatDouble等制作一个具有相同定义的实例。

2 个答案:

答案 0 :(得分:8)

instance Num a => Num (Vector a) where
   negate = fmap negate

考虑编写其他方法。

(如果您开启deriving (Eq, Show, Functor),则可以写-XDeriveFunctor。)

答案 1 :(得分:2)

Vector设为Num的实例可能是一个坏主意。这是Num

的声明
class Num a where
  (+) :: a -> a -> a
  (*) :: a -> a -> a
  (-) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a

+-以及negate没问题。可以将*定义为交叉乘积,但仅限于3向量,这实际上是拉伸它。 abssignumfromInteger没有任何有意义的定义。

简而言之,可以将Vector鞋拔成Num,但结果并不好。

您可能希望探索替代标准Prelude类的替代类型类层次结构,例如Numeric prelude