ParMap的Monoid实例?

时间:2018-07-09 08:28:02

标签: scala functional-programming scala-cats monoids

Cat中是否有Monoid的{​​{1}}实例?我不这样认为,但我不确定。

如果没有,那么我将如何创建这样的实例?这是我到目前为止所拥有的...

scala.collection.parallel.ParMap

...您可以假定为类型import cats._ import implicits._ def parMapMonoid[K, V]: Monoid[ParMap[K, V]] = { new Monoid[ParMap[K, V]] { def combine(v1: ParMap[K, V], v2: ParMap[K, V]): ParMap[K, V] = { ??? } def empty: ParMap[K, V] = { ParMap.empty[K, V] } } } 定义了一个适当的Monoid实例。对于我的V中的特定用例。

2 个答案:

答案 0 :(得分:0)

如果您只需要以某种方式组合ParMap,那么您就可以使用常规Monoid[Map[_, _]] 。不,很遗憾,您不能这样做,因为ParMap不是Map的子类型。 但是,如果您想利用意识形态FP,则应避免使用ParMap之类的结构,因为它们将数据描述和执行模型混合在一起。

答案 1 :(得分:0)

这将按点组合值,键k的缺失值由V-monoid的identity元素替换:

def parMapMonoid[K, V](implicit vMon: Monoid[V]): Monoid[ParMap[K, V]] = {
  new Monoid[ParMap[K, V]] {
    def combine(v1: ParMap[K, V], v2: ParMap[K, V]): ParMap[K, V] = {
      val allKeys = v1.keys ++ v2.keys
      (for (k <- allKeys) yield {
        (k, vMon.combine(
          v1.getOrElse(k, vMon.empty),
          v2.getOrElse(k, vMon.empty)
        ))
      })(collection.breakOut)
    }
    def empty: ParMap[K, V] = {
      ParMap.empty[K, V]
    }
  }
}

由于allKeys也是一个并行集合,因此整个结构仍应“合理地并行化”。