如何组合幺半群类型的数组?
How to combine arrays of monoid type?
幺半群类型的列表或数组 A
也是一个幺半群。现在我想 combine
整数数组使用 cats
.
scala> 1 |+| 2
res1: Int = 3
scala> Array(1, 2, 3) |+| Array(1, 2, 3)
<console>:21: error: value |+| is not a member of Array[Int]
Array(1, 2, 3) |+| Array(1, 2, 3)
我想得到 Array(2, 4, 6)
作为 Array(1, 2, 3) |+| Array(1, 2, 3)
的结果。我该怎么做?
combine
在 Seq
或 Array
上通常意味着追加它们以创建一个新的集合。
但是,您可以通过定义自己的 Monoid
来完成您想做的事情,使用 zip
而不是 append
。这是我临时想出的东西:
implicit val zipArrayMonoid = new Monoid[Array[Int]] {
override def combine(x: Array[Int], y: Array[Int]) = {
x.zip(y).map {
case (a, b) => a + b
}
}
override def empty = Array.empty
}
这将导致不同大小的数组忽略它们的附加值(因为这是 zip
实现所做的,您可以查看文档 here)
这是一个带有结果的 scalaFiddle:https://scalafiddle.io/sf/YzdUl4L/0
幺半群类型的列表或数组 A
也是一个幺半群。现在我想 combine
整数数组使用 cats
.
scala> 1 |+| 2
res1: Int = 3
scala> Array(1, 2, 3) |+| Array(1, 2, 3)
<console>:21: error: value |+| is not a member of Array[Int]
Array(1, 2, 3) |+| Array(1, 2, 3)
我想得到 Array(2, 4, 6)
作为 Array(1, 2, 3) |+| Array(1, 2, 3)
的结果。我该怎么做?
combine
在 Seq
或 Array
上通常意味着追加它们以创建一个新的集合。
但是,您可以通过定义自己的 Monoid
来完成您想做的事情,使用 zip
而不是 append
。这是我临时想出的东西:
implicit val zipArrayMonoid = new Monoid[Array[Int]] {
override def combine(x: Array[Int], y: Array[Int]) = {
x.zip(y).map {
case (a, b) => a + b
}
}
override def empty = Array.empty
}
这将导致不同大小的数组忽略它们的附加值(因为这是 zip
实现所做的,您可以查看文档 here)
这是一个带有结果的 scalaFiddle:https://scalafiddle.io/sf/YzdUl4L/0