2017-03-13 6 views
0

私は現在のコンテキストで暗黙的に利用可能にしたい項目(この場合はスプレーマーシャラ)をList持っています。ちょうど明確にする:私はList自体が暗黙的に利用可能ではないが、リストの各要素を望んでいません。誰かがこれを行うにはトリックを持っていますか?あるいは、実際には不可能なのは、コンパイル時に正確なimplicitsが利用可能でなければならないからですか?Scala Listのコンテンツを暗黙的に利用できるようにするにはどうすればよいですか?

+0

どこで/どのように使用するのかのコード例はありますか? – Soapy

+1

タイプごとに、暗黙検索で1つのインスタンスしか選択できません。複数のインスタンスが利用可能で暗黙の検索で選択できない場合は、 'error:ambiguous implicit values'を取得します。 'List [T]'のすべての要素は 'T'型です。では、どうしたらうまくいくのでしょうか? –

+0

さらにいくつかのコンテキスト:ユーザーがHTTP APIの複数のバージョンを使用できるようにするライブラリの一部としてディレクティブを作成しようとしていました。この指令は、適切なマーシャラーを対象とします。しかし、このソリューションは、コンパイル時と実行時のロジックw.r.tを組み合わせています。暗黙のうちに。私は今、別のパスを選択しました。元のものを置き換え、マーシャラーの暗黙のリストを引数として取るカスタムの 'complete'ディレクティブです。このディレクティブは、正しいマーシャラーを選択し、応答を作成します。魅力的な作品!あなたの貢献に感謝します! –

答えて

2

この特定のケースでは、私が正しく理解していれば、特定のすべてのマーシャラーをコンテキストで利用できるようにする必要があるため、暗黙的にそれぞれを提供する必要があります。

オブジェクトにオブジェクトを配置し、それらを暗黙の値として定義する必要があります。

object Protocol { 
    implicit val marshaller1: ... 
    implicit val marshaller2: ... 
} 

その後、Protocolオブジェクトをインポートすることで、あなたはすべてのあなたのマーシャラーが暗黙的に利用できるだろう。

あなたの質問に答えるために、はい、暗黙のうちに暗黙のうちに解決されます。したがって、特定のマーシャラーを使用する必要があるときはいつでも、暗黙の解決アルゴリズムは特定のマーシャータイプのvalueを探します。あなたがリストからそれを得ることができない理由はこれであり、あなたはこれをどちらの方法でも望んではいけません。

+0

これは、さまざまなマーシャラが異なるタイプとして宣言されている場合にのみ機能します。上記のコメントを参照してください。あなたが同意しない場合は、機能するコードを提供してください。 – WillD

+0

あなたの答えは私が私の解決策で間違った軌道に乗っていたことに気づきました...私の感覚に来てくれてありがとう;) –

+0

@ Jan-Pieter私は本当にうれしいです。 –

0

あなたは確かに型崩れしてこれを実現することができます

import shapeless._ 
import shapeless.ops.hlist.Selector 

case class A() 
case class B() 
case class C() 

val list : A :: B :: C :: HNil = A() :: B() :: C() :: HNil 

def screamIfAccessible[T](implicit selector: Selector[A :: B :: C :: HNil ,T]) = { 
    selector(list) // Actually picks the T type element 
       // from the HList to work with 
    println("YAY!") 
} 

screamIfAccessible[A] 
screamIfAccessible[B] 

Shapeless - Generic programming with scala

リスト(あるいはこの場合はHList)からタイプAの要素にアクセスする必要がある、あなたのコード内の任意の方法をする必要がありますSelector暗黙の引数を持っています

関連する問題