在 Scala 中输入 class API

Type class API in Scala

这是我正在考虑在 Scala 中使用的一种模式,它可以在不限制类型的情况下定义契约,但仍然具有流畅的 API 而没有所有冗长的隐含性 [..]。

想法是在类型 class 之上构建隐式 class,如下所示:

implicit class NumberLikeApi[N : NumberLike](n: N)
  def add(n2: N): N = implicitely[NumberLike[N]].add(n, n2)
}

现在,在作用域中有了正确的隐式,你可以这样做:

val sum = n1.add(n2)

而不是:

val sum = implicitly[NumberLike[N]].add(n1, n2)

我的问题:是否可以通过某种方式自动生成/生成隐式 class 部分?它基本上是 class.

类型的重复

我在语言和标准库中找不到任何东西。某个库中是否有可以执行此操作的宏?

simulacrum的目的应该就是这个

从它的自述文件,你可以写

import simulacrum._

@typeclass trait Semigroup[A] {
  @op("|+|") def append(x: A, y: A): A
}

然后像

一样使用它
// instance for Semigroup[Int] 
implicit val semigroupInt: Semigroup[Int] = new Semigroup[Int] {
  def append(x: Int, y: Int) = x + y
}

import Semigroup.ops._

1 |+| 2 // 3