我(实际上,这是从我的工作示例中简化的)试图将一个标记的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]
}
这里的问题是poly
不是一个稳定的标识符,或者它不够稳定,或者类似的东西。下面的代码可以正常工作:
object poly extends Poly1 { ... }
我不确定我是否见过比迈尔斯对我这个答案(现在已经四年半了)的评论更好的解释了。