Haskell 如何处理类成员函数中的类型类约束
GHCI抱怨Haskell 如何处理类成员函数中的类型类约束,haskell,typeclass,Haskell,Typeclass,GHCI抱怨(k*a,k*b)内部的k和a类型。我猜它不知道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
(k*a,k*b)
内部的k
和a
类型。我猜它不知道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)
问题在于,您的
mul
签名表示v
可以与任何类型的k
相乘,该类型具有Num
实例:Int
、Double
、复数Double
,等等
但是对于向量空间,你需要一些非常不同的东西:对于每个v
,都有一个特定的k
。这可以通过两种方式完成(在按照注释中的建议修复数据点x=点x
之后):
我最初使用这两种方法给出了解决方案,但阅读链接文档并亲自尝试可能更有帮助。它确实知道这一点,但不知道
a
和b
是同一类型。在Haskell中,(+)
、(-)
、(*)
等的操作数都具有相同的类型。没有(+)::Int->Double->Double
。好吧,也许我应该为x和y定义相同类型的点。不仅对于x
和y
,对于k
和x
,因此k
和y
,元组是冗余的;这只是一个不必要的间接层<代码>数据点xy=点xy或(更好)数据点x=点xx
足够了。@WillemVanOnsem有没有办法指定k
、x
和y
都必须是相同的类型?