2017-07-30 8 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] [エラー]何か((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を実際のHListに使用します

+0

ありがとうございますが、何か(A(1):: A(2):: HNil)で動作しますか? – Korkor

+0

@Korkorはい、私が言ったように、 'asHList'の代わりに実際のHListに' <:<'を使用します –

関連する問題