Как я могу реализовать обобщенную функцию c в scala, которая позволяет добавлять аргументы и суммировать их? - PullRequest
1 голос
/ 26 февраля 2020

Как бы я определил обобщенную функцию c, если бы я хотел, чтобы ее аргументы можно было добавлять вместе?

def f[A <: (addition??)](first: A, second: A): Unit = println(first + second)

Ответы [ 2 ]

5 голосов
/ 26 февраля 2020

Предоставляя Полугруппу экземпляров классов типов и инфиксный оператор + через метод расширения, например

trait Semigroup[A] {
  def combine(x: A, y: A): A
}

case class Foo(v: Int)
case class Bar(a: String, b: String)

implicit val fooSemigroup: Semigroup[Foo] = (x: Foo, y: Foo) => Foo(x.v + y.v)
implicit val barSemigroup: Semigroup[Bar] = (x: Bar, y: Bar) => Bar(x.a + y.a, x.b + y.b)

implicit class SemigroupOps[A](x: A) {
  def +(y: A)(implicit ev: Semigroup[A]): A = ev.combine(x, y)
}

Foo(41) + Foo(1)                     // res0: Foo = Foo(42)
Bar("He", "wo") + Bar("llo", "rld")  // res1: Bar = Bar(Hello,world)

Теперь ваш метод может быть ограничен примерно так

def f[A](first: A, second: A)(implicit ev: Semigroup[A]): Unit = 
  println(first + second)

Этот ответ пытается просто проиллюстрировать концепцию, поэтому на практике прислушиваются к комментариям Луиса и используют готовые средства для кошек.

5 голосов
/ 26 февраля 2020

Если вы говорите о добавлении числовых c значений, вы можете использовать класс типов Numeric следующим образом:

def f[A](first: A, second: A)(implicit n: Numeric[A]): Unit =
  println(n.plus(first, second))

Для более общего «сложения» вам придется определить свой собственный класс типов, который определяет, как «сложить» два значения вместе.

Существует множество статей о Scala типовых классах, так что выберите тот, который вам кажется подходящим, или посмотрите здесь множество вопросов о них!

[Или посмотрите ответ Марио Гали c :)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...