arrays - 如何组合幺半群类型的数组?

标签 arrays scala monoids scala-cats

A 类型的幺半群列表或数组也是一个幺半群。现在我想使用 catscombine 整数数组。

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) 代替。我该怎么做?

最佳答案

SeqArray

combine 通常意味着追加它们以创建一个新的 Collection。

但是,您可以通过定义自己的 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

关于arrays - 如何组合幺半群类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42649084/

相关文章:

haskell - Monoid vs MonadPlus

Java从文件中读取数组

java - 无法弄清楚为什么数组显示为空

scala - Function.tupled 和占位符语法

java - 如何确保我的 N1QL 查询考虑最近的更改?

c# - LINQ 相当于 f# 的 builder.Zero()?

c++ - 尝试从文本文件读取到对象数组

javascript - 在 JavaScript 中从数组中查找索引#

java - Scala 中有 java.io.InputStream 的替代品吗?

haskell - FoldMap 采用错误类型的参数?