ParMap 的幺半群实例?
Monoid instance for ParMap?
Cats 中是否存在 scala.collection.parallel.ParMap
的现有 Monoid
实例?我不这么认为,但我不确定。
如果没有,那么我将如何创建这样的实例?这是我目前所拥有的...
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]
}
}
}
...您可以假定为类型 V
定义了一个适当的 Monoid
实例。对于我的 type V=Int
中的特定用例。
如果您只需要以某种方式组合 ParMap
,那么您 可以只使用常规的 Monoid[Map[_, _]]
。不,不幸的是,你不能,因为 ParMap
不是 Map
的子类型。
但是如果你想利用 ideomatic FP,你应该避免像 ParMap
这样的结构,因为它们混合了数据描述和执行模型。
这将逐点组合值,键 k
的缺失值被 V
-monoid 的标识元素替换:
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
也是平行合集,所以整个构造应该还是"reasonably parallelized".
Cats 中是否存在 scala.collection.parallel.ParMap
的现有 Monoid
实例?我不这么认为,但我不确定。
如果没有,那么我将如何创建这样的实例?这是我目前所拥有的...
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]
}
}
}
...您可以假定为类型 V
定义了一个适当的 Monoid
实例。对于我的 type V=Int
中的特定用例。
如果您只需要以某种方式组合 ParMap
,那么您 可以只使用常规的 。不,不幸的是,你不能,因为 Monoid[Map[_, _]]
ParMap
不是 Map
的子类型。
但是如果你想利用 ideomatic FP,你应该避免像 ParMap
这样的结构,因为它们混合了数据描述和执行模型。
这将逐点组合值,键 k
的缺失值被 V
-monoid 的标识元素替换:
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
也是平行合集,所以整个构造应该还是"reasonably parallelized".