代码之家  ›  专栏  ›  技术社区  ›  Aron Lee

在Haskell中实例化num类

  •  0
  • Aron Lee  · 技术社区  · 6 年前

    我有Vectorx课程,我想超载 "dot product" 带算子 (*:) 努姆班

    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

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

    任何帮助都将不胜感激。

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

    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 回复  |  直到 6 年前
        1
  •  4
  •   assembly.jc    6 年前

    对于您的情况,它不适合子类 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
    

    你仍然可以举例说明 号码 定义 (+), (*) 或ETC操作 Vectorx 但这与上面无关 DotPoduct 班级。