2

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

0 回答 0