2016-07-23 4 views
5

タイプメンバが型パラメータに抽出されるAuxパターン(シェイプレスや他の場所で使用されているような)の感覚が少しありますが、同じ引数リストの引数が 'お互いに依存していますが、私は一般的にどのようなものが使用されているのか、どのような問題が解決するのかはっきりしていません。AuxパターンはScalaで何を達成しますか?

たとえば、私は現在、ホワイトボックスマクロによって返されたより具体的なタイプを保存して処理する方法を理解しようとしています。これはAuxの用途ですか?

簡単な説明はありますか?

+0

いくつかの議論のために私の答え[ここ](ここをクリック)(http://stackoverflow.com/a/34548518/334519)を参照してください。 –

答えて

5

このパターンを使用すると、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のすべてのキーのリストであることを証明している"

関連する問題