[英]Haskell: Num instance of non-concrete type
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
等创建一个具有相同定义的实例。
instance Num a => Num (Vector a) where
negate = fmap negate
也考虑编写其他方法。
(如果打开-XDeriveFunctor
deriving (Eq, Show, Functor)
则可以编写deriving (Eq, Show, Functor)
。)
使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 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.