mergeKeys
キーで値をグループ化するメソッドを書きたいと思いIterable[(K, V)]
ます。たとえば、次のように書くことができます。
def mergeKeysList[K, V](iter: Iterable[(K, V)]) = {
iter.foldLeft(Map[K, List[V]]().withDefaultValue(List.empty[V])) {
case (map, (k, v)) =>
map + (k -> (v :: map(k)))
}
}
Monoid
ただし、のメソッドを記述する代わりに、any を使用できるようにしたいと考えていList
ます。たとえば、値が整数である可能性があり、それらをリストに追加する代わりに合計したいとします。または(String, Int)
、セット内の文字列を蓄積したいが整数を追加したいタプルである可能性があります。どうすればそのようなメソッドを書くことができますか? または、これを行うために scalaz で使用できるものは他にありますか?
更新: 思ったほど遠くありませんでした。私は少し近づいたが、値がタプルである場合にそれを機能させる方法はまだわからない。さらに別の暗黙的な変換を記述する必要がありますか? つまり、型パラメーターの数ごとに 1 つの暗黙的な変換ですか?
sealed trait SuperTraversable[T, U, F[_]]
extends scalaz.PimpedType[TraversableOnce[(T, F[U])]] {
def mergeKeys(implicit mon: Monoid[F[U]]): Map[T, F[U]] = {
value.foldLeft(Map[T, F[U]]().withDefaultValue(mon.zero)) {
case (map, (k, v)) =>
map + (k -> (map(k) |+| v))
}
}
}
implicit def superTraversable[T, U, F[_]](
as: TraversableOnce[(T, F[U])]
): SuperTraversable[T, U, F] =
new SuperTraversable[T, U, F] {
val value = as
}