Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala使用Scalaz半群处理与自定义类型的冲突时组合映射_Scala_Scalaz - Fatal编程技术网

Scala使用Scalaz半群处理与自定义类型的冲突时组合映射

Scala使用Scalaz半群处理与自定义类型的冲突时组合映射,scala,scalaz,Scala,Scalaz,我特别尝试过重载+,但这并不能让我执行。我怎样才能创建一个特殊的类型,使我能够利用半群来实现这一点 |+|的参考:您需要为您的特殊类型提供一个半群实例。此类实例的“最佳”位置是该类型的伴生对象,因为在该位置定义的实例将自动可用: case class Special(foo: Bar) { } case class SpecialMap(bar: Map[SpecialKey, Special]) { //I want to be able to

我特别尝试过重载+,但这并不能让我执行。我怎样才能创建一个特殊的类型,使我能够利用半群来实现这一点


|+|的参考:

您需要为您的
特殊类型提供一个半群实例。此类实例的“最佳”位置是该类型的伴生对象,因为在该位置定义的实例将自动可用:

    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
           }
    }
(请注意,我只是简化了一点,但在您的案例中想法是一样的。)

然后:

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))