如何处理类成员函数中的类型类约束

时间:2018-10-08 18:06:53

标签: haskell typeclass

GHCI抱怨ka(k * a, k * b)的类型。我的猜测是它不知道kNum,但我不知道如何指定它。

module Point where

data Point x y = Point (x, y)

class Vector v where
  add :: v -> v -> v
  sub :: v -> v -> v
  mul :: Num k => k -> v -> v

instance (Num a, Num b) => Vector (Point a b) where
  add (Point (a, b)) (Point (c, d)) = Point (a + c, b + d)
  sub (Point (a, b)) (Point (c, d)) = Point (a - c, b - d)
  mul k (Point (a, b)) = Point (k * a, k * b)

1 个答案:

答案 0 :(得分:1)

问题是您的mul签名表明v可以乘以具有k实例的 any 类型NumIntDoubleComplex Double等。

但是对于向量空间,您想要一些非常不同的东西:说每个k有一个特定的v。这可以通过两种方式来完成(在注释中建议固定data Point x = Point x x之后):

  1. 将多参数类型类与functional dependency一起使用;

  2. 使用associated types

最初,我同时使用了这两种解决方案,但是阅读链接的文档并亲自尝试可能会更有帮助。