重载(+)

xua*_*nji 11 haskell typeclass

我试图在haskell中定义Vector3数据类型,并允许在其上使用(+)运算符.我尝试了以下方法:

data Vector3 = Vector3 Double Double Double    
Vector3 x y z + Vector3 x' y' z' = Vector3 (x+x') (y+y') (z+z')
Run Code Online (Sandbox Code Playgroud)

但是ghci抱怨(+)的模糊发生.我不明白为什么这个事件是模棱两可的; 肯定地,类型检查器可以推断x,x',y等具有Double类型,因此用于它们的正确运算符是Prelude.+?

我知道我可以让Vector3成为Num类型类的一个实例,但这对我来说太限制了; 我不想用另一个向量定义向量的乘法.

ham*_*mar 18

在Haskell中重载名称的唯一方法是使用类型类,因此您有三种选择:

  • 制作Vector一个实例Num并且只有乘法返回一个error.
  • 使用类似数字前奏的东西,它定义了更细粒度的数字类.
  • 选择一些其他名称.+.或类似的东西添加矢量.

  • Conal Elliott的`vector-space`包比`numeric-prelude`轻得多.对于添加向量,定义`AdditiveGroup`的实例. (3认同)