我已经阅读了一些关于同样问题的Q&A,但似乎找不到适用于我的情况的解决方案。
本质上,我需要定义一个方法,该方法接受一个x(其中x <: T),以及一个l(其中L <: HList),并使用在每个可能从T继承的类中定义的Poly1对l进行映射。
我已经尝试了几种方式,但最后一次尝试导致了一些相当可怕的scalac bomb。 我一定做了什么非常愚蠢的事情,但似乎无法理解它!
import shapeless._
import ops.hlist._
trait T {
val fun: Poly1
}
case class C() extends T {
object fun extends Poly1 {
implicit val caseInt = at[Int](i => "int " + i)
override def toString = "here I am, poly1"
}
}
def method[X <: T](x: X) = x.fun
method(C())
res0: shapeless.Poly1 = here I am, poly1
def method2[X <: T, L <: HList](x: X, l: L)(implicit m: Mapper[x.fun.type, L]) = l map x.fun
method(C(), 23 :: HNil) //BOOM!
C()
是易失性的,这会使对fun
情况的隐式搜索变得困难。 - Miles Sabin