2016-04-10 17 views
0

val s = Seq[Int] ve varsa tüm elemanlarının üretimini almak istiyorum. Değerin Int.MaxValue'dan büyük, ancak Long.MaxValue'dan daha küçük olması garantilidir, bu yüzden değerin Long türü olmasını umuyorum.Scala'da bir Seq [Int] uzun yazmalı üretimi nasıl elde edilir?

Ben nedeniyle Long ve Int herhangi ilişkilerin olmadan farklı türleri vardır gerçeğine product/foldLeft/reduceLeft kullanamazsınız görünüyor; bu yüzden kendim için bir döngü yazmam gerekiyor. Bu hedefe ulaşmak için iyi bir yol var mı?

Not: Yalnızca yerleşik kütüphaneleri kullanma olasılığından bahsediyorum ama yine de aşağıda "çirkin" kodla sorun yok.

def product(a: Seq[Int]): Long = { 
    var p = 1L 
    for (e <- a) p = p * e 
    p 
    } 
+0

"t nedeniyle uzun ve Int herhangi ilişkilerin olmadan farklı olmasından ötürü ürün/foldLeft/reduceLeft kullanamazsınız görünüyor;" Bu yanlış. Cevabımı tam olarak –

cevap

4

asInstanceOf veya kendi döngüsünüzle uğraşmanıza gerek yok. gayet foldLeft eserler

val xs = Seq(1,1000000000,1000000) 
xs.foldLeft(1L)((a,e) => a*e) 
//> res0: Long = 1000000000000000 
1

Nasıl

def product(s: Seq[Int]) = s.map(_.asInstanceOf[Long]).fold(1L)(_ * _)

Aslında

hakkında, sorunuzu salt yeniden ve ürünün kendisi varlığı hakkında öğrenmiş, tıpkı senin olabilir:

def product(s: Seq[Int]) = s.map(_.asInstanceOf[Long]).product

+0

'a bakın! bunu fark etmedim! Btw, şahsen ben 'luz' tercih ederim. –

İlgili konular