14

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

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

3 回答 3

20

斯卡拉兹

import scalaz._, Scalaz._

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

任何具有隐式作用域|+|的类都有一个运算符。For默认情况下(您可以在代码中重新定义它)。ASemigroup[A]Int |+|+

Semigroup[(A, B)]如果存在隐式SemigroupforA和 ,则所有元组都有一个隐式B

请参阅Scalaz 备忘单

于 2013-10-26T12:45:37.047 回答
13

+1 为Scalaz答案:-)

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

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,更通用的数字版本:

所以这是最简单的版本,只为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)
于 2013-10-26T12:54:01.970 回答
1

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

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

同样,它依赖于Semigroup.

于 2019-05-23T15:54:08.283 回答