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

标签 scala tuples implicit

我希望能够将数字元组(整数和 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)

但是当我为 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

根据 Andri 的建议尝试加倍
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 的语法很灵活,但并不是无限灵活。特别是,元组、参数和隐式的汇合使得这成为库设计空间中一个非常危险的区域。正如您所注意到的,事情可能会中断,无法正常工作,并给出神秘的错误消息。如果可以,我建议你避免它。

特别是,我建议您做出以下定义:

val V = Vector

然后您的所有示例都按您的预期工作,没有任何隐含的、神奇的或神秘的错误消息,并且每个 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

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

关于scala - 如何在 Scala 中将元组隐式转换为向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/707162/

相关文章:

scala - Spark 标度 : select column name from other dataframe

list - 将数字输入到空列表 Python

python - 元组:+= 运算符抛出异常,但成功了吗?

c++ - C++ 运算符中的隐式类型转换规则

scala - Shapeless3 和注释

arrays - 如何在Scala中高效地将阵列复制到另一个阵列?

scala - 如何更新现有 SparkSession 实例或在 spark-shell 中创建一个新实例?

scala - 如何避免在 Scala 中调用 asInstanceOf

xml - PlayFramework:获取原始请求 xml 正文作为字符串

swift - 无法理解 Swift Tuple 比较