Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何处理类成员函数中的类型类约束_Haskell_Typeclass - Fatal编程技术网

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

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

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 (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
    都必须是相同的类型?