我正在尝试创建一个类型类,它将允许我在任何case类上递增一个名为"counter“的Int字段,只要该类有这样的字段。
我曾经尝试过使用Shapeless来做这件事,但是遇到了麻烦(在第一次尝试消化了“类型宇航员指南到Shapeless",Shapeless 2.0.0的”特性概述“和大量关于Stack Overflow的线程之后)。
我想要的是能够像这样做
case class MyModel(name:String, counter:Int) {}
val instance = MyModel("Joe", 4)
val incremented = instance.increment()
assert(incremented == MyModel("Joe", 5))它应该适用于任何具有合适的计数器字段的case类。
我认为这可以使用类型类和Shapeless的记录抽象(以及隐式转换来获得作为方法添加的增量功能)。基本框架是这样的:
trait Incrementer[T] {
def inc(t:T): T
}
object Incrementer {
import shapeless._ ; import syntax.singleton._ ; import record._
implicit def getIncrementer[T](implicit generator: LabelledGeneric[T]): Incrementer[T] = new Incrementer[T] {
def inc(t:T) = {
val repr = generator.to(t)
generator.from(repr.replace('counter, repr.get('counter) + 1))
}
}
}但是,这不能编译。错误是value replace is not a member of generator.Repr。我猜这是因为编译器不能保证T有一个名为counter的字段,并且它是Int类型的。但是我怎么能这样说呢?有没有更好的/更多关于Shapeless‘记录的文档?或者这是一条完全错误的道路?
https://stackoverflow.com/questions/44676613
复制相似问题