Transpozycja dowolnych kolekcji kolekcji w Scali

Muszę często transponować kolekcję „prostokątnych” kolekcji w Scali, np. Listę map, mapę list, mapę map, zestaw list, mapę zbiorów itp. Ponieważ zbiory mogą być jednolite postrzegane jako odwzorowanie z określonej domeny na współdomenę (np .: Lista [A] / Tablica [A] to odwzorowanie z domeny Int do domeny A, Zestaw [A] to odwzorowanie z A domena do Boole'owskiej ko-domeny itp.), chciałbym napisać czystą, ogólną funkcję do wykonania operacji transpozycji (np .: zamienić mapę list na transponowaną listę map). Mam jednak problemy, ponieważ inny niż operator (), Scala nie wydaje się mieć zunifikowanego interfejsu API do abstrakcyjnego przeglądania kolekcji jako odwzorowań?

Więc kończę pisać osobną transpozycję dla każdego typu kolekcji kolekcji w następujący sposób:

def transposeMapOfLists[A,B]( mapOfLists: Map[A,List[B]] ) : List[Map[A,B]] = {
  val k = ( mapOfLists keys ) toList
  val l = ( k map { mapOfLists(_) } ) transpose;
  l map {  v => ( k zip v ) toMap }
}

def transposeListOfMaps[A,B]( listOfMaps: List[Map[A,B]]) : Map[A,List[B]] = {
  val k = ( listOfMaps(0) keys ) toList
  val l = ( listOfMaps map { m => k map { m(_) } } ) transpose;
  ( k zip l ) toMap
}

def transposeMapOfMaps[A,B,C]( mapOfMaps: Map[A,Map[B,C]] ) : Map[B,Map[A,C]] = {
  val k = ( mapOfMaps keys ) toList
  val listOfMaps = k map { mapOfMaps(_) }
  val mapOfLists = transposeListOfMaps( listOfMaps )
  mapOfLists map { p => ( p._1, ( k zip p._2 ) toMap ) }
}

Czy ktoś może mi pomóc w ujednoliceniu tych metod w jedną ogólną kolekcję zbiorów transponowanych? Pomoże mi również (i jestem pewien, że inni) nauczyć się przydatnych funkcji Scala w tym procesie.

ps: Zignorowałem obsługę wyjątków i założyłem, że zbiór kolekcji wejściowych jest prostokątny, tj. wszystkie elementy domeny kolekcji wewnętrznych stanowią ten sam zestaw.

questionAnswers(1)

yourAnswerToTheQuestion