如何在Scala中将元组隐式转换为向量

如何在Scala中将元组隐式转换为向量,scala,tuples,implicit,Scala,Tuples,Implicit,我希望能够隐式地将数字元组(int和double)转换为向量对象 使用+方法假设向量类 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和double)转换为向量对象

使用+方法假设向量类

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)
但当我为double添加转换时,它失败了

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 

我需要做些什么才能让它工作

这些隐式转换是不明确的,因此Scala不会使用它们中的任何一个。这就是最后几行不会计算的原因


解决这个问题的一种方法是完全不使用
int2vec
,尽管这意味着所有整数都将首先隐式转换为双精度。

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

这并不完全是您想要的语法,但相信我,从长远来看,它将为您省去痛苦和头痛。

谢谢。我显然是个白痴,因为我还是不能让它工作。