我对 Cats 中的 simulacrum 中的 @typeclass 是什么有点好奇。
这是来自 doc 的示例,它运行良好且有意义。
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 个参数,我不知道 3 个参数如何适用于 @op。据我了解,半群是两个参数的组合。但是,编译并没有抱怨任何错误,所以我想知道应该将@op 宏改进为只接受 2 个参数,或者如何为@op 使用更多的 3 个参数。
@typeclass trait CanAppend[T] {
@op("|+|") def append(a: T b: T, C: T): T
}