在其参数类型

时间:2016-11-13 18:37:33

标签: scala shapeless

我(实际上,这完全是从我的工作示例中简化)尝试在包含正确参数类型的记录上映射逆变(常量返回值,多态参数类型)函数的标记HList(记录)这些功能。 我知道ZipApply,这似乎适用于HLists,但我特别希望无论顺序如何都这样做,并且专门使用键类型来选择要使用的函数。

这是我的代码示例,由于我无法弄清楚原因而无法编译:

import shapeless._
import labelled._
import ops.hlist._
import ops.record.Selector
import syntax._
import syntax.singleton._
import syntax.HListOps

object POC {
  case class Foo(bar: String)
  val gen = LabelledGeneric[Foo]
  val funs = ('bar ->> { s: String => s.toUpperCase() }) :: HNil

  val poly = new Poly1 {
    implicit def apply[K, V]
    (implicit selector: Selector.Aux[funs.type, K, (V) => String]) =
      at[FieldType[K, V]] { v => selector(funs)(v) }
  }

  def run(foo: Foo)(implicit mapper: Mapper[poly.type, gen.Repr]) =
    mapper(gen to foo)

  println(run(Foo("bar")))
  // could not find implicit value for parameter mapper: shapeless.ops.hlist.Mapper[POC.<refinement>.type,POC.gen.Repr]
}

1 个答案:

答案 0 :(得分:2)

这里的问题是poly不是稳定的标识符,或者它不够稳定,或类似的东西。以下内容可以正常使用:

object poly extends Poly1 { ... }

我不确定我是否已经看到了比Miles对this answer of mine(现在已有四年半)的评论更好的解释了。