在Scala中添加两个包含简单元素的元组

时间:2013-10-26 12:39:03

标签: scala tuples

是否有一种简单的方法来添加包含Int,Doubles等可添加元素的元组? 例如,

(1,2) + (1,3) = (2,5)

3 个答案:

答案 0 :(得分:18)

Scalaz

import scalaz._, Scalaz._

scala> (1, 2.5) |+| (3, 4.4)
res0: (Int, Double) = (4,6.9)

对于范围内隐含|+|的任何类A,都有一个运算符Semigroup[A]。默认情况下Int |+|+(您可以在代码中重新定义)。

如果Semigroup[(A, B)]Semigroup隐含A,则所有元组都有隐式B

请参阅Scalaz cheat sheet

答案 1 :(得分: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)

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

所以这是最简单的版本,只为Int定义,我们可以使用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)

答案 2 :(得分:0)

这也适用于Cats,并且类似于scalaz的答案:

> (1,2) |+| (1,3)
res3: (Int, Int) = (2, 5)

同样,它依赖于Semigroup