如何使用Map([K,V])而不是Map [K,V]创建Map构造函数?

时间:2017-10-10 17:13:54

标签: scala scala-collections

使用元组表单似乎在使用例如Iterable接口时处理。但是,Map类型构造函数采用两个类型参数,而Iterable只采用一个(2元组)。

简而言之,我想做一些像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有两个类型参数,但I只接受一个类型参数。

1 个答案:

答案 0 :(得分: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]