Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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
为什么scalaz中没有TrieMap的半群实例_Scala_Scalaz_Semigroup - Fatal编程技术网

为什么scalaz中没有TrieMap的半群实例

为什么scalaz中没有TrieMap的半群实例,scala,scalaz,semigroup,Scala,Scalaz,Semigroup,当我能做的时候 Map("a" -> 1) |+| Map("a" -> 2) 似乎没有人支持这个计划 TrieMap("a" -> 1) |+| TrieMap("a" -> 2) 为什么?Scalaz没有提供形成半群的所有可能的类型+操作组合,但您可以轻松实现它,例如使用以下隐式: import scala.collection.concurrent.TrieMap import scalaz._, Scalaz._ implicit def trieMapSe

当我能做的时候

Map("a" -> 1) |+| Map("a" -> 2)
似乎没有人支持这个计划

TrieMap("a" -> 1) |+| TrieMap("a" -> 2)

为什么?

Scalaz
没有提供形成半群的所有可能的类型+操作组合,但您可以轻松实现它,例如使用以下
隐式

import scala.collection.concurrent.TrieMap
import scalaz._, Scalaz._

implicit def trieMapSemigroup[K: BuildKeyConstraint, V: Semigroup]: Semigroup[TrieMap[K, V]] =
  new Semigroup[TrieMap[K, V]] {
    def append(m1: TrieMap[K, V], m2: => TrieMap[K, V]) =
      (m1 /: m2) { case (res, (k, v)) =>
        res += (k -> res.get(k).cata(Semigroup[V].append(_, v), v))
      }
  }
这给了您预期的:

scala> TrieMap("a" -> 1) |+| TrieMap("a" -> 2)
res: TrieMap(a -> 3)
当然,这将适用于
scalaz
中定义的作为半群的每个值


那幺半群呢? 如果您想要一个优化版本的
隐式
,它也可以用作幺半群:

  implicit def trieMapMonoid[K: BuildKeyConstraint, V: Semigroup]: Monoid[TrieMap[K, V]] = new Monoid[TrieMap[K, V]] {
    def zero = TrieMap.empty[K, V]

    def append(m1: TrieMap[K, V], m2: => TrieMap[K, V]) = {
      val m2Instance: TrieMap[K, V] = m2
      val (from, to, semigroup) = {
        if (m1.size > m2Instance.size) (m2Instance, m1, Semigroup[V].append(_: V, _: V))
        else (m1, m2Instance, (Semigroup[V].append(_: V, _: V)).flip)
      }
      from.foldLeft(to) {
        case (res, (k, v)) => res += (k -> res.get(k).map(semigroup(_, v)).getOrElse(v))
      }
    }
  }

(代码无耻改编自
scalaz/std/Map.scala

scalaz并不关注对可变集合的支持。另外,几个月前我做了一个关于scala中半群的演示,解释了如何在我的答案中创建
隐式
。幻灯片如下: