1
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; 当然这应该是可能的?否则我将不得不为Int, Integer, Float,Double等创建一个实例,所有这些都具有相同的定义。

4

2 回答 2

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

考虑编写其他方法。

deriving (Eq, Show, Functor)(打开就可以写了-XDeriveFunctor。)

于 2012-05-18T00:14:08.683 回答
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 向量,这真的是在拉伸它。abssignum并且fromInteger没有有意义的定义。

简而言之,可以硬塞Vector进去Num,但结果并不好。

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

于 2012-05-18T19:09:35.193 回答