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
等制作一个具有相同定义的实例。
答案 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向量,这实际上是拉伸它。 abs
,signum
和fromInteger
没有任何有意义的定义。
简而言之,可以将Vector
鞋拔成Num
,但结果并不好。
您可能希望探索替代标准Prelude类的替代类型类层次结构,例如Numeric prelude。