문제

나는 방법을 쓰 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))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top