Transposición de colecciones arbitrarias en Scala

A menudo tengo que transponer una colección "rectangular" de colecciones en Scala, por ejemplo: una lista de mapas, un mapa de listas, un mapa de mapas, un conjunto de listas, un mapa de conjuntos, etc. Dado que las colecciones pueden ser uniformes visto como un mapeo de un dominio específico a un co-dominio (por ejemplo: una Lista [A] / Array [A] es un mapeo del dominio Int al co-dominio A, el Conjunto [A] es un mapeo del A dominio al co-dominio booleano, etc.), me gustaría escribir una función genérica y limpia para realizar una operación de transposición (p. ej., convertir un mapa de listas a la lista de mapas transpuesta). Sin embargo, tengo problemas porque, aparte del operador (), ¿Scala no parece tener una API unificada para ver las colecciones de forma abstracta como asignaciones?

Así que termino escribiendo una transposición separada para cada tipo de colección de colecciones de la siguiente manera:

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 ) }
}

¿Puede alguien ayudarme a unificar estos métodos en una transposición genérica de colecciones de colecciones? También me ayudará (y estoy seguro de que otros) a aprender algunas características útiles de Scala en el proceso.

ps: He ignorado el manejo de excepciones y he asumido que la colección de colecciones de entrada es rectangular, es decir, todos los elementos de dominio de las colecciones internas constituyen el mismo conjunto.

Respuestas a la pregunta(1)

Su respuesta a la pregunta