它编译的代码片段需要更改哪些内容?
import shapeless._
import LUBConstraint._
import ops.hlist.Prepend
class Foo[L <: HList: <<:[Int]#λ](val l: L) {
def ++[H <: HList: <<:[Int]#λ](h: H)(implicit prepend: Prepend[L, H]) = {
new Foo(l ::: h)
}
}
目前:
could not find implicit value for evidence parameter of type shapeless.LUBConstraint[prepend.Out,Int]
答案 0 :(得分:7)
好问题......你非常接近: - )
问题在于,即使对我们来说很明显,Scala编译器也无法推断两个HLists
个Int
元素的串联是HList
的{ {1}}元素。我们可以通过将连接类型拉出到类型变量(Int
中来帮助它,注意使用Out
类型别名来约束这个新类型变量)然后要求它直接证明Prepend.Aux
具有必需的属性(通过要求Out
的形状的证据,
Out