如何在scala中实现一个泛型函数,该泛型函数可以添加和求和参数?

如果要确保可以将其参数添加在一起,该如何定义泛型函数?

def f[A <: (addition??)](first: A, second: A): Unit = println(first + second)
马里奥·加里奇(Mario Galic)

例如,通过扩展方法提供Semigroup类型类实例和infix+运算符

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)

这个答案试图仅说明概念,因此在实践中,请注意Luis的评论并使用开箱即用的猫咪设施。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章