Scala 在使用 Scalaz semigroup 处理与自定义类型的冲突时结合映射
Scala combining maps while handling collision with custom type with Scalaz semigroup
case class Special(foo: Bar) {
}
case class SpecialMap(bar: Map[SpecialKey, Special]) {
//I want to be able to do
def combineValuesMap(that: SpecialMap) : SpecialMap = {
this.bar |+| that.bar
}
}
我已经尝试过重载 + ,但是这并没有使我能够执行。我怎样才能创建一个特殊的类型,让我可以利用半群来做到这一点?
参考|+| : Best way to merge two maps and sum the values of same key?
您需要为您的 Special
类型提供半群实例。此类实例的 "best" 位置是该类型的伴随对象,因为在那里定义的实例将自动可用:
case class Special(foo: String)
object Special {
import scalaz.Semigroup
implicit val semigroupSpecial: Semigroup[Special] = Semigroup.instance(
(specialA, specialB) => Special(s"(${specialA.foo}-${specialB.foo})")
)
}
(请注意,我进行了一些简化,但您的想法是相同的。)
然后:
import scalaz.std.map._, scalaz.syntax.semigroup._
val m1 = Map("a" -> Special("a"), "b" -> Special("b"))
val m2 = Map("c" -> Special("c"), "b" -> Special("another b"))
val m3 = m1 |+| m2
这将使用您提供的组合函数在发生碰撞时组合值:
scala> m3.foreach(println)
(c,Special(c))
(b,Special((b-another b)))
(a,Special(a))
这就是你想要的。
case class Special(foo: Bar) {
}
case class SpecialMap(bar: Map[SpecialKey, Special]) {
//I want to be able to do
def combineValuesMap(that: SpecialMap) : SpecialMap = {
this.bar |+| that.bar
}
}
我已经尝试过重载 + ,但是这并没有使我能够执行。我怎样才能创建一个特殊的类型,让我可以利用半群来做到这一点?
参考|+| : Best way to merge two maps and sum the values of same key?
您需要为您的 Special
类型提供半群实例。此类实例的 "best" 位置是该类型的伴随对象,因为在那里定义的实例将自动可用:
case class Special(foo: String)
object Special {
import scalaz.Semigroup
implicit val semigroupSpecial: Semigroup[Special] = Semigroup.instance(
(specialA, specialB) => Special(s"(${specialA.foo}-${specialB.foo})")
)
}
(请注意,我进行了一些简化,但您的想法是相同的。)
然后:
import scalaz.std.map._, scalaz.syntax.semigroup._
val m1 = Map("a" -> Special("a"), "b" -> Special("b"))
val m2 = Map("c" -> Special("c"), "b" -> Special("another b"))
val m3 = m1 |+| m2
这将使用您提供的组合函数在发生碰撞时组合值:
scala> m3.foreach(println)
(c,Special(c))
(b,Special((b-another b)))
(a,Special(a))
这就是你想要的。