Как неявно преобразовать кортежи в вектор в Scala - PullRequest
5 голосов
/ 02 апреля 2009

Я хочу иметь возможность неявно преобразовывать кортежи чисел (Ints и double) в векторный объект.

Принимая класс Vector с методом +

case class Vector(x: Double, y:Double){
  def + (v:Vector)= new Vector(x+v.x,y+v.y)
} 

Моя цель - заставить работать следующий код.

val vec = (1,2)+(.5,.3) // vec == Vector(1.5,2.3)

Я могу заставить его работать на Int со следующим

implicit def int2vec(t:Tuple2[Int,Int])=new Vector(t._1,t._2)
val vec = (1,2)+(3,4) // vec == Vector(4.0,6.0)

Но происходит сбой, когда я добавляю преобразование для двойного

implicit def int2vec(t:Tuple2[Int,Int])=new Vector(t._1,t._2)
implicit def double2vec(t:Tuple2[Double,Double])=new Vector(t._1,t._2)
val a = (1,2)
val b = (.5,.3)
val c = (1,1)+b // vec = Vector(1.5,1.3)
val d = (1,2)+(.3,.5) // compile error: wrong number of arguments
val e = (1,2)+((.3,.5)) // compile error: type mismatch

Попытка удвоить за каждое предложение Андри

implicit def double2vec(t:Tuple2[Double,Double])=new Vector(t._1,t._2)
val a = (.5,.3)
val b = (1,1)+a // type mismatch found:(Double,Double) required:String 

Что мне нужно сделать, чтобы заставить это работать?

Ответы [ 2 ]

11 голосов
/ 02 апреля 2009

Синтаксис Scala гибкий, но не бесконечно гибкий. В частности, слияние кортежей, параметров и последствий делает это действительно опасной областью в пространстве проектирования библиотеки. Как вы заметили, вещи могут сломаться, работать не очень хорошо и давать загадочные сообщения об ошибках. Я бы посоветовал вам избежать этого, если сможете.

В частности, я предлагаю вам дать следующее определение:

val V = Vector

И тогда все ваши примеры будут работать так, как вы ожидаете, без каких-либо последствий, магических или загадочных сообщений об ошибках и за счет только одного символа на Вектор.

val a = V(1,2)+V(.5,.3)
val b = V(1,2)+V(3,4)
val c = V(1,2)
val d = V(.5,.3)
val e = V(1,1)+b
val f = V(1,2)+V(.3,.5)
val g = V(.5,.3)
val h = V(1,1)+a

Это не совсем тот синтаксис, который вам нужен, но, поверьте мне, он избавит вас от боли и головной боли в долгосрочной перспективе.

0 голосов
/ 02 апреля 2009

Эти неявные преобразования неоднозначны, и поэтому Scala не будет использовать ни одно из них. По этой причине последние строки не будут оцениваться.

Один из способов исправить это - полностью исключить int2vec, хотя это означает, что все целые числа будут сначала неявно преобразованы в двойные.

...