2017-10-10 6 views
0

タプルフォームを使用すると、例えば、Iterableインターフェイスで作業しているようです。しかし、Map型のコンストラクタは2つの型引数をとり、Iterableは1つしか取らない(2タプル)。Map [K、V]の代わりにMap([K、V])を使用してMapコンストラクタを作成するにはどうすればよいですか?

つまり、私はtype Map[(+A, +B)] = Map[A, B]のようなことをしたいと思いますが、これは無効なScalaコードです。そして、私が言うことができる:

type MapItem = (K,V) 
type MyMap = Map[MapItem] 

を私が現在持っている例のユースケースは、次のように私は関数が定義されているということです。

def requestDecodeIterable[B, I[X] <: Iterable[X]](reqRx: Rx[HttpRequest]) 
(implicit stuff ...): Rx[I[B]] = ... 

私はこのようにそれを呼び出すことができるようにしたい:

type CodebookNameItem = (CodebookId, CodebookName) 
type CodebookNameCollection[+A, +B] = Map[A, B] 
requestDecodeIterable[CodebookNameItem, CodebookNameCollection](request) 

CodebookNameCollectionは2つのタイプパラメータを取りますが、Iは1つのタイプパラメータしか取らないため、これはもちろん機能しません。

+0

これは役に立ちそうな状況を表示できますか? –

+0

@IonuţG.Stan - 確かに、私は私の質問を更新しました。 – bbarker

答えて

1

私は、主な課題は、単一のパラメータがTuple2であることを保証する方法を持っていなければならないと考えて、個々の型を取り出すことです。

は、私はちょうど文を入力すると、これが可能であるかどうかわからないんだけど、あなたはこのような何かを行うことができます:

trait CanBuildIterable[A, B] { 
    type Out <: Iterable[B] 
} 

implicit def defaultCanBuildIterable[A[X] <: Iterable[X], B] = new CanBuildIterable[A[_], B] { 
    type Out = A[B] 
} 

implicit def mapCanBuildIterable[K, V] = new CanBuildIterable[Map[_, _], (K, V)] { 
    type Out = Map[K, V] 
} 

def requestDecodeIterable[B, I](reqRx: Rx[HttpRequest]) 
(implicit cbi: CanBuildIterable[I, B], ... other implicits ...): Rx[cbi.Out] = ... 

あなたはその後、requestDecodeIterable[CodebookNameItem, Map[_, _]]ようにそれを呼び出すことができ、および戻り値の型はMap[CodebookId, CodebookName]です。

+0

これはかなり面白いですし、多くの場合うまくいくでしょう - ありがと!!私は後で元の 'I [B]'署名で動作するかどうか確認します。私が移動する必要がある多くの種類。 – bbarker

+0

他の暗黙的なパラメータが 'I [B]'を利用しているという問題があります。 – bbarker

関連する問題