の値をキーでグループ化する方法mergeKeys
を書きたいと思います。例えば、私は書くことができます:Monoidでキーを使って値をグループ化する
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)))
}
}
しかし、私はList
するための方法を書くのではなく、任意のMonoid
を使用できるようにしたいと思います。たとえば、値は整数で、リストに追加するのではなく、それらを合計したいとします。または、私は文字列を累積して整数にするタプル(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
}
パーフェクトを与え、感謝:あなたの文字列+ int型の例をやってみたかったと言います! – schmmd