2017-07-30 73 views
1

我試圖隱式創建一個hlist。如何通過隱式函數從單個元素創建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 <:shapeless.HList] [錯誤]東西(A(1))//沒有行爲[錯誤]^[錯誤]

類型不匹配; [error] found:Boot.A [error] required:L [error] something(A(1))

無法找到參數lUBConstraint的隱式值:shapeless.LUBConstraint [L,Boot.A] [error]東西(A(1)

+0

它以什麼方式不起作用?有錯誤嗎?如果是這樣,請提供如下所示的錯誤。 – Dekker

+0

我編輯了這個問題。 – Korkor

回答

0

IIRC Scala的隱式轉換不會觸發滿足類型界限

您可以修改您的something定義,允許任何這樣的轉換工作。

def something[X, L <: HList](x: X)(
    implicit asHList: X => L, 
      lUBConstraint: LUBConstraint[L, A], 
      isHCons: IsHCons[L] 
) = { 
    println("works") 
} 

對於si爭論點,這將使用您的lift函數和<:<Predef爲實際HLists

+0

謝謝,但它是否適用於某些事情(A(1):: A(2):: HNil)? – Korkor

+0

@Korkor是的,就像我說的那樣,它將使用'<:<'代替實際的HList來代替'asHList' –

相關問題