Добавьте два кортежа, содержащих простые элементы в 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
.