我试图隐含地创建一个hlist。
case class A(value: Int)
implicit def lift(single: A): A :: HNil = single :: HNil
def something[L <: HList](l: L)(implicit lUBConstraint: LUBConstraint[L, A],
isHCons: IsHCons[L]) = {
println("works")
}
something(A(1) :: A(2) :: HNil) //works
something(A(1)) //not works
something(lift(A(1))) //works
某事(A(1))不起作用。但是,我使用intellij的想法,它可以检测到升力适合在这里使用。
以下是编译器的错误消息。
推断类型参数[Boot.A]不符合方法某些类型参数的界限[L&lt;:shapeless.HList] [错误]某事(A(1))//无效[错误] ^ [错误]
类型不匹配; [error] found:Boot.A [error] required:L [error] something(A(1))
找不到参数lUBConstraint的隐含值:shapeless.LUBConstraint [L,Boot.A] [error] something(A(1)
答案 0 :(得分:0)
IIRC Scala隐式转换不会触发满足类型界限。
您可以修改something
的定义,以允许任何此类转换发挥作用:
def something[X, L <: HList](x: X)(
implicit asHList: X => L,
lUBConstraint: LUBConstraint[L, A],
isHCons: IsHCons[L]
) = {
println("works")
}
对于单个参数,这将使用您的lift
函数和来自<:<
的{{1}}用于实际的HLists