在Scala中,我能否将一个函数既作为右结合又作为左结合来实现?

3
我想将标量乘以向量定义如下:

只需按以下方式进行:

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

我可以将 * 定义为Vector类的函数来实现第一种情况。那么如何实现第二种情况呢?我想到的一种方法是使用右关联的函数,但这需要在函数名称中添加“::”,这样并不容易阅读。我希望第二种情况看起来就像第一种情况一样。怎样才能在Scala中实现呢?谢谢。


您可以使用独立函数。 - n. m.
2个回答

3
你需要为标量类型添加一个隐式转换,使其成为具有*(x: Vector)方法的类。只需简单地实现:
implicit class ScalarVectorMult(scalar: Double) {
  def *(vector: Vector): Vector = vector * scalar
}

需要将其放在一个包对象或对象中 -- 直接放在包上不起作用。


2

我认为你需要对这个库进行一些优化。

对于第一个情况:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接