在scala中添加两个构成简单元素的元组

Aru*_*run 12 scala tuples

有没有一种简单的方法来添加包含Int,Doubles等可添加元素的元组?举些例子,

(1,2) + (1,3) = (2,5)
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 18

Scalaz

import scalaz._, Scalaz._

scala> (1, 2.5) |+| (3, 4.4)
res0: (Int, Double) = (4,6.9)
Run Code Online (Sandbox Code Playgroud)

|+|任何A具有隐式Semigroup[A]范围的类都有一个运算符.对于Int |+|+默认(你可以在你的代码重新定义它).

有一个隐含的Semigroup[(A, B)]所有元组是否有隐含SemigroupAB.

请参阅Scalaz备忘单.


Kon*_*ski 11

Scalaz答案+1 :-)

如果你想要一个非常简单的版本,你可以定义一个隐式类,如:

implicit class TuppleAdd(t: (Int, Int)) {
  def +(p: (Int, Int)) = (p._1 + t._1, p._2 + t._2)
}

(1, 1) + (2, 2) == (3, 3)
Run Code Online (Sandbox Code Playgroud)

// update1,数字的更通用版本:

所以这是最简单的版本,仅为Ints 定义,我们可以使用Scala为所有数值生成Numeric:

implicit class Tupple2Add[A : Numeric, B : Numeric](t: (A, B)) {
  import Numeric.Implicits._

  def + (p: (A, B)) = (p._1 + t._1, p._2 + t._2)
}

(2.0, 1) + (1.0, 2) == (3.0, 3)
Run Code Online (Sandbox Code Playgroud)

  • 问题中不仅有"Int".你可以用`math.Numeric`改进你的答案:`implicit class TuppleAdd [A:Numeric,B:Numeric](t:(A,B)){import Numeric.Implicits._; def +(p:(A,B))=(p._1 + t._1,p._2 + t._2)}`. (2认同)
  • 我还试图实现`隐式def tupleIsNumeric [A:数字,B:数字]:数字[(A,B)]`,但有[问题](http://pastebin.com/fyty7mMy) `+`运算符(`-`和`*`工作正常). (2认同)