그룹 값에 의해 키와 Monoid
문제
나는 방법을 쓰 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
쓰는 대신 방법 List
.예를 들어,값을 수 있는 정수하고 내가 원하는 합계를 대신 그들을 추가에서 그들 목록입니다.이 있을 수도 있습니다 튜플 (String, Int)
고 싶은 곳에 축적되는 문자열 집합에서만 추가 정수입니다.나는 어떻게 쓰는 이러한 방법은?또는 다른 뭔가가 있에서 사용할 수 있습 scalaz 이행?
업데이트:지 않았으로 멀리로 나는 생각했다.내가 조금 더 가까운,그러나 나는 아직도 알지 못하는 방법을 작동하는 경우 값은 튜플이 있습니다.이 필요한가요를 쓰는 또 다른 암시적 변환?I.e., 하나 암시적 변환을 위해 각각의 번호를 입력 매개변수는?
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
}
해결책
첫 번째는 동안,그것은 타당하지 않고,당신의 질문을 제한하는 코드
일반성에 의해 명시적으로 언급된 유형을 생성자 F[_]
.동
이렇게 하지 않고:
sealed trait SuperTraversable[K, V]
extends scalaz.PimpedType[TraversableOnce[(K, V)]] {
def mergeKeys(implicit mon: Monoid[V]): Map[K, V] = {
value.foldLeft(Map[K, V]().withDefaultValue(mon.zero)) {
case (map, (k, v)) =>
map + (k -> (map(k) |+| v))
}
}
}
[...]
지금,당신의 실제적인 질문이 있을 변경할 필요가 없 mergeKeys
을 처리
재미있는 종류의 조합;성 Monoid
을 처리하는 어떤 종류의
를 결합하려는 않습니다.말을 하고 싶은 당신의 문자열+수를 들어:
implicit def monoidStringInt = new Monoid[(String, Int)] {
val zero = ("", 0)
def append(a: (String, Int), b: => (String, Int)) = (a, b) match {
case ((a1, a2), (b1, b2)) => (a1 + b1, a2 + b2)
}
}
println {
List(
"a" -> ("Hello, ", 20),
"b" -> ("Goodbye, ", 30),
"a" -> ("World", 12)
).mergeKeys
}
공
Map(a -> (Hello, World,32), b -> (Goodbye, ,30))
제휴하지 않습니다 StackOverflow