我可以在scala中强制执行一个函数作为正确的关联和左关联吗?

时间:2013-12-05 03:28:35

标签: scala

我喜欢定义标量乘法向量,如下所示:

Vector * scalar   (1)
scalar * Vector   (2)

我可以将*定义为实现第一种情况的Vector类的函数。然后,我如何实现第二种情况,我能想到的一种方法是使用正确的关联函数,但它需要我添加" ::"在函数名称中,不可读。我希望第二种情况看起来像第一种情况。我怎样才能在scala中创建它?感谢

2 个答案:

答案 0 :(得分:3)

您需要将标量类型的隐式转换添加到具有*(x: Vector)方法的类中。它可以像

一样简单
implicit class ScalarVectorMult(scalar: Double) {
  def *(vector: Vector): Vector = vector * scalar
}

需要将其放在包对象或对象中 - 将其直接放在包中是行不通的。

答案 1 :(得分:2)

我认为你需要做一些图书馆的pimpin。

对于第一种情况:

class MyVector(vector: Vector[Double]) {
   def *(scalar: Double) = vector.map(_ * scalar)
}

implicit def vectorToMyVector(vector: Vector[Double]) = new MyVector(vector)

然后对于第二种情况,你会做类似的事情:

class Scalar(value: Double) {
   def *(vector: Vector[Double]) = vector.map(_ * value)
}

implicit def doubleToScalar(value: Double) = new Scalar(value)