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
中的特定用例。
答案 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
也是一个并行集合,因此整个结构仍应“合理地并行化”。