2014-07-11 15 views
5

Mam proste tablicę krotkiJak mogę uzyskać sumę tablic krotek w Scala

val arr = Array((1,2), (3,4),(5,6),(7,8),(9,10)) 

Chciałbym dostać (1+3+5+7+9, 2+4+6+8+10) krotki jako odpowiedź

Jaki jest najlepszy sposób, aby uzyskać suma jak krotki, podobnie jak regularne tablice. Próbowałem:

To nie działa.

Przepraszamy za niepodpisanie kontekstu. Używałem go w oparzeniu z algebrem. Algebird pozwala na sumy krotek i założyłem, że to zadziała. To był mój błąd.

+0

scalaz ma ten ... – dhg

Odpowiedz

5

Nie ma czegoś takiego jak dodatek Tuple, więc nie może działać. Trzeba by działać na każdym rzędnej Tuple:

val res = arr.foldLeft(0,0){ case (sum, next) => (sum._1 + next._1, sum._2 + next._2) } 

res: (Int, Int) = (25,30) 
2

To powinno działać ładnie:

arr.foldLeft((0,0)){ case ((a0,b0),(a1,b1)) => (a0+a1,b0+b1) } 

Dodatek nie jest zdefiniowana za krotki.

1

Zastosowanie scalaz, który określa krotki jako półgrupa, dzięki czemu można użyć operatora append |+|

import scalaz._ 
import Scalaz._ 

arr.fold((0,0))(_ |+| _) 
0

Jeszcze inną alternatywą

val (a, b) = arr.unzip 
         //> a : Array[Int] = Array(1, 3, 5, 7, 9) 
         //| b : Array[Int] = Array(2, 4, 6, 8, 10) 
(a.sum, b.sum)   
         //> res0: (Int, Int) = (25,30) 
+0

Ten nie jest sprawne, będzie przechodzić przez kolekcję trzy razy (rozpakować i dwa razy sumować). –

+0

Prawidłowo. Jest to również oczywiste, co moim zdaniem jest również ważne. –

Powiązane problemy