Scalaz 는 세미 그룹 ( Semigroup) 이라는 개념을 가지고 있습니다. 세미 그룹 은 여기에서하고 싶은 일을 포착하여 가장 짧거나 가장 깨끗한 솔루션으로 이끌어줍니다.
scala> import scalaz._
import scalaz._
scala> import Scalaz._
import Scalaz._
scala> val map1 = Map(1 -> 9 , 2 -> 20)
map1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 9, 2 -> 20)
scala> val map2 = Map(1 -> 100, 3 -> 300)
map2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 100, 3 -> 300)
scala> map1 |+| map2
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 109, 3 -> 300, 2 -> 20)
특히, 이항 연산자 Map[K, V]
는 맵의 키 를 결합하여 V
중복 값 위에 세미 그룹 연산자를 접습니다 . 표준 세미 그룹 Int
은 더하기 연산자 를 사용하므로 각 중복 키에 대한 값의 합계를 얻습니다.
편집 : user482745의 요청에 따라 조금 더 자세히.
수학적으로 세미 그룹 은 값 집합이며 해당 집합에서 두 개의 값을 가져와 해당 집합에서 다른 값을 생성하는 연산자와 함께 사용됩니다. 따라서 추가중인 정수는 세미 그룹입니다. 예를 들어 +
연산자는 두 개의 정수를 결합하여 다른 정수를 만듭니다.
또한 "주어진 키 유형 및 값 유형을 가진 모든 맵"세트에 대해 세미 그룹을 정의 할 수 있습니다. 두 맵을 결합하여 새로운 맵을 생성하는 조작을 수행 할 수있는 한 입력.
두 맵에 모두 키가 없으면 사소한 것입니다. 두 키에 동일한 키가 존재하는 경우 키가 매핑되는 두 값을 결합해야합니다. 흠, 우리는 같은 유형의 두 엔티티를 결합하는 연산자를 설명하지 않았습니까? 이것이 Scalaz에서 semigroup for Map[K, V]
가 존재하는 경우에만 semigroup for 가 존재 하는 이유입니다.-semigroup for V
- V
semigroup은 동일한 키에 할당 된 두 맵의 값을 결합하는 데 사용됩니다.
따라서 Int
여기에 값 유형이 있기 때문에 1
키 의 "충돌" 은 두 개의 매핑 된 값을 정수로 추가하여 해결됩니다 (Int의 세미 그룹 연산자가하는 것과 같이) 100 + 9
. 값이 문자열 인 경우 충돌로 인해 두 매핑 된 값의 문자열 연결이 발생했습니다 (다시 말하면 문자열에 대한 반 그룹 연산자가 수행하기 때문입니다).
(문자열 연결은 교환 법칙이 성립하지 않기 때문에 그리고 흥미롭게도, -,된다 "a" + "b" != "b" + "a"
-. 반군 결과 작업은 그래서 어느 아닌 map1 |+| map2
다른 map2 |+| map1
문자열의 경우가 아니라 지능의 경우.)
map1 ++ map2