2015-05-15 3 views
5

In Haskell, eine Funktion gibt fromListWith genannt, die eine Karte von einer Funktion (verwendete Werte mit dem gleichen Schlüssel fusionieren) erzeugen können, und eine Liste:Gibt es in Scala ein Äquivalent von Haskells "fromListWith" für Map?

fromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a 

Der folgende Ausdruck wird true bewertet:

fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")] 

In Scala gibt es eine ähnliche Funktion toMap auf List Objekte genannt, die auch eine Liste in eine Map umwandeln kann, aber es kann nicht einen Parameter der Funktion, um mit duplizierten Schlüssel haben.

Hat jemand Ideen dazu?

Antwort

8

Neben scalaz verwenden, können Sie auch eine selbst definieren:

implicit class ListToMapWith[K, V](list: List[(K, V)]) { 
    def toMapWith(op: (V, V) => V) = 
    list groupBy (_._1) mapValues (_ map (_._2) reduce op) 
} 

Hier ist ein Anwendungsbeispiel:

scala> val testList = List((5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")) 
scala> testList toMapWith (_ + _) 
res1: scala.collection.immutable.Map[Int,String] = Map(5 -> aba, 3 -> ba) 
+0

über ähnelte etwas zu schreiben. +1, um mir zu zeigen, dass 'mapValues' existiert. –

+2

Beachten Sie, dass 'mapValues' eine Ansicht zurückgibt, die den Wert bei jedem Zugriff neu berechnet, was in diesem Fall möglicherweise nicht wünschenswert ist. –

3

Die stdlib hat keine solche Funktion, es ist jedoch ein Port Data.Map verfügbar in scalaz, dass does have diese Funktion verfügbar ist.

Verwandte Themen