引数を一緒に追加できるようにしたい場合、ジェネリック関数をどのように定義しますか?
def f[A <: (addition??)](first: A, second: A): Unit = println(first + second)
たとえば、拡張メソッドを介してセミグループ型クラスインスタンスと中置+
演算子を提供する
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)
この回答は概念を説明することを目的としているため、実際には、ルイスのコメントに注意し、すぐに使用できる猫の施設を使用してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加