2017-03-07 77 views
2

幺半群类型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),而不是结果。我怎样才能做到这一点 ?

+1

这不是真正的'| + |'。它意味着是一个附加操作。如果阵列的大小不一样会发生什么? –

+0

_A monoid类型的列表或数组也是一个monoid too_这是理论上的,但你需要在代码中实际提供一个'Monoid [Array]通过“隐式”。 – sebszyller

+0

@MichaelZajac谢谢。我可能是错的。幺半群的数组可能不是幺半群。 – Michael

回答

2

combineSeqArray通常意味着追加他们创建一个新的集合。

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

+0

谢谢!但是如果阵列的大小不一样? – Michael

+0

作了编辑:) –

+1

实例违反每一个monoid法律。 – drexin