实例化Haskell中的Num类

时间:2018-12-17 18:21:03

标签: haskell

我有Vectorx类,我想重载"dot product" 与Num类中的运算符(*:)

data Vectorx a = Vectorx a a a 

instance (Num a)=>Num(Vectorx a) where
    (+) ...
    (-) ...
    etc ...
    (*:) (Vectorx x0 y0 z0) (Vectorx x1 y1 z1) = x0*x1 + y0*y1 + z0*z1 

在我看来,我无法在(*:)的实例中添加Num运算符

在Java中,我可以添加实现接口或扩展抽象类时想要的任何方法。

任何帮助将不胜感激。

这是我从建议中得到的更新代码,但我仍然收到“类型错误”

data Vectorx a = Vectorx a a a

class Num a => (VectorOp a) where
    (*:)::Num b=> a -> a -> b

instance (Num a) => Num(Vectorx a) where
    (+) _ _ = undefined

instance VectorOp (Vectorx a) where
    (*:) (Vectorx x0 y0 z0) (Vectorx x1 y1 z1) = x0*x1 + y0*y1 + z0*z1

1 个答案:

答案 0 :(得分:4)

对于您的情况,不适合使用Num类的子类来计算向量dot product。只需将向量的元素约束为数字即可:

class DotProduct v where
    (*:)::Num a=>v a ->v a -> a

并将其实例化为:

data Vectorx a = Vectorx a a a

instance DotProduct Vectorx where
    (*:) (Vectorx x0 y0 z0) (Vectorx x1 y1 z1) = x0*x1 + y0*y1 + z0*z1

您仍然可以为Num实例化(+), (*)来定义Vectorx或其他操作,但这与以上DotPoduct类无关。