2017-03-07 28 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