首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala/Shapeless:更新case类实例中的命名字段

Scala/Shapeless:更新case类实例中的命名字段
EN

Stack Overflow用户
提问于 2017-06-21 20:48:02
回答 0查看 480关注 0票数 6

我正在尝试创建一个类型类,它将允许我在任何case类上递增一个名为"counter“的Int字段,只要该类有这样的字段。

我曾经尝试过使用Shapeless来做这件事,但是遇到了麻烦(在第一次尝试消化了“类型宇航员指南到Shapeless",Shapeless 2.0.0的”特性概述“和大量关于Stack Overflow的线程之后)。

我想要的是能够像这样做

代码语言:javascript
复制
case class MyModel(name:String, counter:Int) {}

val instance = MyModel("Joe", 4)
val incremented = instance.increment()
assert(incremented == MyModel("Joe", 5))

它应该适用于任何具有合适的计数器字段的case类。

我认为这可以使用类型类和Shapeless的记录抽象(以及隐式转换来获得作为方法添加的增量功能)。基本框架是这样的:

代码语言:javascript
复制
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‘记录的文档?或者这是一条完全错误的道路?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44676613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档