このパターンを使用すると、2つのジェネリック型パラメータ間の関係を確立できます。
さんがあなたにケースクラスのジェネリックHList
表現与え型崩れLabelledGeneric
型クラスを見てみましょう:
trait LabelledGeneric[T] {
type Repr
}
T
は、入力タイプであるが、すなわちLabelledGeneric[MyCaseClass]
はあなたにMyCaseClass
のHList表現を与えます。 Repr
は出力タイプ、すなわちT
に対応するHListタイプです。
Generic
インスタンスを取り、出力タイプの別のパラメータが必要なメソッドを作成しましょう。たとえば、私たちは、Scalaはあなたがここにgen
またはkeys
にアクセスできませんので、これは動作しないことを除いてラベルされたジェネリック
def fieldNames[T](implicit gen: LabelledGeneric[T], keys: Keys[gen.Repr]): keys.Repr …
のフィールド名を収集するためにKeys
を使用することができます。具体的な型または型の変数を持つことができます。 AUXセンド出番
は、そして、それはだ:それは私たちが型変数への「リフト」gen.Repr
してみましょう:
object Generic {
type Aux[T, Repr0] = Generic[T] { type Repr = Repr0 }
}
として、あなたはAux
型が型変数にRepr
から私たちに道を与えて見ることができるので、我々は最終的にfoo
を定義することができます。
def foo[T, Repr, K](
implicit gen: LabelledGeneric.Aux[T, Repr],
keys: Keys.Aux[Repr, K]
): K …
あなたがプロローグに精通している場合は、証明述語として補助を読むことができます2つの型変数間の関係。上記の例では、 "LabelledGenericはRepr
がTのラベルを持つ総称表現であることを証明し、Keys.AuxはKがReprのすべてのキーのリストであることを証明している"
いくつかの議論のために私の答え[ここ](ここをクリック)(http://stackoverflow.com/a/34548518/334519)を参照してください。 –