2017-10-10 2 views
0

L'utilisation de la forme de tuple semble être utile lorsque l'on travaille par exemple avec des interfaces Iterable. Cependant, le constructeur de type Map prend deux arguments de type, et Iterable n'en prend qu'un (un 2-tuple). En bref, je voudrais faire quelque chose comme: type Map[(+A, +B)] = Map[A, B], mais c'est un code Scala invalide. Je pourrais dire:Comment créer un constructeur Map en utilisant Map ([K, V]) au lieu de Map [K, V]?

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

Le cas par exemple d'utilisation j'est actuellement que j'ai fonction définie comme suit:

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

J'aimerais pouvoir l'appeler comme ceci:

Toutefois, cela ne fonctionne pas bien sûr, car CodebookNameCollection prend deux paramètres de type, mais I ne prend qu'un seul paramètre de type.

+0

Pouvez-vous montrer une situation où cela serait utile? –

+0

@ IonuţG.Stan - bien sûr, j'ai mis à jour ma question. – bbarker

Répondre

1

Je pense que le principal problème est que vous devez avoir un moyen de vous assurer que le paramètre unique est un Tuple2, puis d'en extraire les types individuels.

Je ne suis pas sûr si cela est possible avec le type juste des déclarations, mais vous pouvez faire quelque chose comme ceci:

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] = ... 

Vous pouvez alors l'appeler comme requestDecodeIterable[CodebookNameItem, Map[_, _]], et le type de retour est un Map[CodebookId, CodebookName].

+0

Ceci est assez intéressant et fonctionne probablement pour de nombreux cas - merci !, je vais essayer de vérifier plus tard pour voir si je peux le faire fonctionner avec la signature d'origine "I [B]', ou en quelque sorte contourner cela - il y a plusieurs types je dois me déplacer. – bbarker

+0

Un problème que je rencontre est que les autres paramètres implicites utilisent 'I [B]'. – bbarker