2013-12-05 2 views
3

Я хотел бы определить скалярный вектор умножения так же, как следующее:Можно ли применить одну функцию как правую ассоциацию и левую ассоциацию в scala?

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

Я мог бы определить * как функции класса Vector, который реализует первый случай. Затем, как я могу реализовать второй случай, один из способов, которым я могу думать, - использовать правильную ассоциированную функцию, но мне нужно добавить «::» в имя функции, которое невозможно прочитать. Я хочу, чтобы второй случай выглядел как первый случай. Как я могу сделать это в scala? Спасибо

+0

Вы можете использовать автономные функции. –

ответ

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) 
3

Вам нужно добавить неявное преобразование из скалярного типа в класс, который имеет метод *(x: Vector). Это может быть так просто, как

implicit class ScalarVectorMult(scalar: Double) { 
    def *(vector: Vector): Vector = vector * scalar 
} 

Это необходимо поместить внутри объекта пакета или объекта - положить его непосредственно на упаковке не будет работать.

Смежные вопросы