Scala 将带标记的函数列表(记录)映射到其参数类型的记录上
我(实际上,这都是从我的工作示例中简化出来的)试图将一个带标签的反变函数(常量返回值,多态参数类型)列表(记录)映射到一个由这些函数的正确参数类型组成的记录上。 我知道ZipApply,这似乎适用于HLists,但我特别希望这样做,而不考虑顺序,并特别使用键类型来选择要使用的函数 下面是我的代码示例,由于我无法理解的原因,它没有编译:Scala 将带标记的函数列表(记录)映射到其参数类型的记录上,scala,shapeless,Scala,Shapeless,我(实际上,这都是从我的工作示例中简化出来的)试图将一个带标签的反变函数(常量返回值,多态参数类型)列表(记录)映射到一个由这些函数的正确参数类型组成的记录上。 我知道ZipApply,这似乎适用于HLists,但我特别希望这样做,而不考虑顺序,并特别使用键类型来选择要使用的函数 下面是我的代码示例,由于我无法理解的原因,它没有编译: import shapeless._ import labelled._ import ops.hlist._ import ops.record.Selecto
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]
}
导入无形状_
进口标签_
导入ops.hlist_
导入ops.record.Selector
导入语法_
导入syntax.singleton_
导入语法.HListOps
对象POC{
案例类Foo(条形图:字符串)
val gen=标签能量[Foo]
val funs=('bar->{s:String=>s.toUpperCase()})::HNil
val poly=新Poly1{
隐式def应用[K,V]
(隐式选择器:selector.Aux[funs.type,K,(V)=>String])=
在[FieldType[K,V]]{V=>selector(funs)(V)}
}
def运行(foo:foo)(隐式映射器:映射器[poly.type,gen.Repr])=
制图员(gen到foo)
println(run(Foo(“bar”))
//找不到参数映射器的隐式值:shapeless.ops.hlist.mapper[POC..type,POC.gen.Repr]
}
这里的问题是poly
不是一个稳定的标识符,或者它不够稳定,或者诸如此类。以下方法可以很好地工作:
object poly extends Poly1 { ... }
我不确定我看到了比迈尔斯的评论(现在已经四年半了)更好的解释这里发生了什么。你使用的是哪种版本的shapeless?@laugedelic 2.3.2我认为丹尼尔·斯皮瓦克在这篇演讲中为这种行为提供了一个合理的理由:(大约28岁)。简言之,这些隐式需要在伴随对象中定义,否则编译器将找不到它们。