GHCI抱怨k
中a
和(k * a, k * b)
的类型。我的猜测是它不知道k
是Num
,但我不知道如何指定它。
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)
答案 0 :(得分:1)
问题是您的mul
签名表明v
可以乘以具有k
实例的 any 类型Num
: Int
,Double
,Complex Double
等。
但是对于向量空间,您想要一些非常不同的东西:说每个k
有一个特定的v
。这可以通过两种方式来完成(在注释中建议固定data Point x = Point x x
之后):
将多参数类型类与functional dependency一起使用;
最初,我同时使用了这两种解决方案,但是阅读链接的文档并亲自尝试可能会更有帮助。