我有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
答案 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
类无关。