Cats の simulacrum の @typeclass とは何かについて少し興味があります。
これはドキュメントの例であり、正常に機能しており、理にかなっています。
import simulacrum._
@typeclass trait CanAppend[A] {
@op("|+|") def append(a: A, b: A): A
@noop def whatever: A
}
object SemiGroup extends App {
implicit val intCanAppend: CanAppend[String] = new CanAppend[String] {
def append(a: String, b: String): String = a + " " + b
def whatever: String = ???
}
import CanAppend.ops._
println("123" |+|"123" ) //123 123
}
ただし、リストに 3 つの引数がある場合、@op に 3 つの引数を適用する方法がわかりません。私の理解では、セミグループは2つの引数の組み合わせです。ただし、コンパイルはエラーを報告しないので、@op マクロを改善して 2 つのパラメーターのみを受け入れるようにするか、@op に 3 つ以上の引数を使用するにはどうすればよいでしょうか。
@typeclass trait CanAppend[T] {
@op("|+|") def append(a: T b: T, C: T): T
}