2016-03-31 11 views
3

別のHList(別のLabelledGenericと同じ)からのタグ付きタイプからLabelledGenericインスタンスを取得しようとしていますが、それは暗黙のものを見つけることができない。タグ付きのケースクラスでLabelledGenericインスタンスを生成すると、シェイプレスでエラーが発生する

正確なエラーが(-x-ログ暗黙の有効化)されています

shapeless.this.DefaultSymbolicLabelling.mkDefaultSymbolicLabelling is not a valid implicit value for shapeless.DefaultSymbolicLabelling.Aux[Inner with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("c")],Inner],K] because: 
hasMatchingSymbol reported error: Inner with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("c")],Inner] is not case class like or the root of a sealed family of types 

これは抜粋です:

case class Inner(a: Int) 
case class Outer(b: Int, c: Inner) 

val gen = LabelledGeneric[Outer] 

val inner = Inner(1) 
val outer = Outer(2, inner) 

def getGen[A, L](x: A)(implicit gen: LabelledGeneric.Aux[A, L]) = gen 

val hOuter = gen.to(outer) 

getGen(hOuter.at(1)) 

私はここで明らかに何かが足りないのですか?

ありがとうございました。

編集:

ケースクラスの定義を追加しました。私はまたscala 2.11.8とシェイプレスを使用しています。012.0

+0

あなたは 'Outer'と' Inner'の定義を含めて、あなたが使っているシェイプレスとスケーラックのバージョンを言うことができますか? –

+0

質問に追加しました – Sandro

答えて

2

LabelledGeneric[Outer]は、形のないレコードにタイプOuterの値をとります。これらはフィールドのHListであり、それぞれの値は "label" ... caseクラスのフィールド名に対応するシングルトンタイプです。 Tのラベル値はタイプTのサブタイプですが、2つのタイプは同じではありません。通常、これは絶対に問題ありません。

シナリオではFieldType['c.type, Inner]のフィールドhOuter.at(1)を使用しています。これは、あなたがその型に対応するLabelledGeneric例えば頼む、

Inner with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("c")],Inner] 

次一口に展開タイプの別名です。 InnerためLabelledGenericインスタンスが存在する一方で、コンパイラのエラーメッセージが(WRT拡大タイプ)言うように、ので、あなたが実際には何のためにラベルを使用していない場合は残念ながら、FieldType['c.type, Inner]のためのインスタンスが

Inner with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("c")],Inner] 
is not case class like or the root of a sealed family of types 

、ありませんこの場合の最も簡単な修正方法は、LabelledGenericの代わりにGenericの代わりに、または少なくともgenの定義を使用することです。

ラベルを使用している場合は、ここで問題を解決するには、フィールドからラベルを取り除くことです。ここでは動作しますが、一般化しない、ということの最も簡単な方法は、InnerFieldType['c.type, Inner]のサブタイプであることに依存しており、型帰属を使用することで、

getGen(hOuter.at(1): Inner) 

これはgetGen意志のその型パラメータAを意味し、 Innerと推測され、LabelledGeneric[A]の暗黙的な検索が成功します。

より一般的な解決方法は、形状のないレコードを取り、各要素からラベルを取り除いて値だけからなるHListを生成する、形状のないValuesタイプのクラスを使用します。

+0

ありがとうございます。私は値を使って終わりました。ありがとう! – Sandro

関連する問題