2017-03-07 11 views
2

monoid 유형 A의 목록이나 배열도 monoid입니다. 이제 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(1, 2, 3) |+| Array(1, 2, 3)의 결과로 Array(2, 4, 6)을 좀하고 싶습니다. 어떻게해야합니까?

+1

이것은'| + | '이 무엇을위한 것이 아닙니다. 추가 작업을 의미합니다. 배열의 크기가 같지 않으면 어떻게됩니까? –

+0

_ monoid type A의리스트 나 배열은 이론적으로는 monoid입니다.하지만 이론적으로는 코드에'Monoid [Array]'를 실제로 써야합니다. 암시 적으로 – sebszyller

+0

@MichaelZajac 감사. 나는 틀렸어. 모노로이드 배열은 아마 모노oid가 아닙니다. – Michael

답변

2

combine (Seq) 또는 Array은 대개 새 컬렉션을 만들기 위해 추가하는 것을 의미합니다.

그러나 Monoid을 정의하여 수행 할 수 있습니다. append 대신 zip이 사용됩니다.

(즉, zip 구현 당신은 문서 here을 확인할 수 있습니다, 무엇을의로)

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 
} 

이 무시 자신의 추가 값을 가지고 다양한 크기의 배열을 발생합니다 : 여기 즉석에서 해낸 일이다 결과가있는 scalaFiddle이 있습니다 : https://scalafiddle.io/sf/YzdUl4L/0

+0

감사합니다.하지만 배열의 크기가 같지 않은 경우는 무엇입니까? – Michael

+0

편집 : –

+1

인스턴스는 모든 단일 monoid 법을 위반합니다. – drexin