2017-03-07 11 views
2

モノイド型のリストまたは配列Aもモノイドです。今私はcatsを使用してcombine整数の配列にしたいと思います。どのようにモノイド型の配列を組み合わせるには?

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(1, 2, 3) |+| Array(1, 2, 3)の結果としてArray(2, 4, 6)を取得したいと思います。どうやってやるの ?

+1

これは本当に '| + |'のためのものではありません。これは、追加操作を意味します。配列のサイズが同じでない場合はどうなりますか? –

+0

_ monoid型Aのリストまたは配列は、理論上はmonoidですが、これは実際にはコード内に 'Monoid [Array]'を用意する必要があります。暗黙的に – sebszyller

+0

@MichaelZajacありがとうございます。私はおそらく間違っていた。モノイドの配列はおそらくモノイドではありません。 – Michael

答えて

2

combineSeqまたはArrayは、通常、それらを追加して新しいコレクションを作成することを意味します。

しかし、Monoidをの代わりに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

それは、それを除外することを意識した決定だったと思います。インスタンスはすべての単一の法則に違反します。 – drexin

関連する問題