如何通过隐式函数

时间:2017-07-30 13:40:40

标签: scala shapeless

我试图隐含地创建一个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)

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