繁体   English   中英

Haskell:非具体类型的Num实例

[英]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的实例; 当然应该可行吗? 否则,我将不得不为IntIntegerFloatDouble等创建一个具有相同定义的实例。

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个向量,这实际上是在扩展它。 abssignumfromInteger没有有意义的定义。

简而言之,有可能将Vector变成Num ,但结果并不理想。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM