我对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
}