簡體   English   中英

如何使用Map([K,V])而不是Map [K,V]創建Map構造函數?

[英]How to create a Map constructor using Map([K,V]) instead of Map[K,V]?

在使用例如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只接受一個類型參數。

我認為主要的挑戰是您必須有一種方法來確保單個參數是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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM