在 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
这是我正在考虑在 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