Добавьте два кортежа, содержащих простые элементы в Scala

Есть ли простой способ добавить кортежи, которые содержат добавляемые элементы, такие как Int, Doubles и т.д.? Например,

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

Ответ 1

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.

Ответ 2

+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, более общая версия для чисел:

Итак, это простейшая версия, определенная только для Int s, мы можем ее обобщать для всех числовых значений с помощью 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)

Ответ 3

Это работает и с Cats, и похоже на ответ scalaz:

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

И также, это полагается на Semigroup.