2013-11-04 15 views
7

Boolean işlevini uygulamak için erişmekte olduğum bir Vektörler Vektörüm var. yani ben f tipi T => Boolean taşımaktadır f(myVector(i)(j)) çizgisinde bir şey yürütmek için gidiyorumScala'da yuvalanmış Sekanslardaki sınırların varsayılan bir şekilde çıkarılması için basit bir yol var mı?

Vector[Vector[T]].

Ancak bu, sınır denetimi yapmıyor ve gerçekten zarif bir şey elde edemiyorum. myVector.applyOrElse(i, (_:Int) => Vector.empty).applyOrElse (j, (_:Int) => defaultT)

nerede f(defaultT)false döneceğini Ama ben sadece bir işlevi yerine bir varsayılan değer ayarlamak isterdim:

Ben applyOrElse kullanabilirsiniz.

Bana bir Option vermek için germe kullanabilirsiniz, ancak ikinci düzeyde iyi beste değildir: çalışır, ama yine de okumak gerçekten zor myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false

.

Ve sonra standart var/eğer başka bloklar:

if (myVector.size <= i) false 
else { 
    val myVector2 = levelVector(i) 
    if (myVector2.size <= j) false 
    else f(myVector2(j)) 
} 

Sadece ben neler başarabileceğini daha kolay ayrıştırılabilir mümkün olmalıdır şey gibi görünüyor. Ve eğer 3. katmanı eklerseniz, daha da çirkinleşir.

Başka seçenekler var mı?

Yasal Uyarı: Bu Coursera en progfun dersten uyarlanmıştır

cevap

2

sorudan aşağıdaki kodu alın

myVector.lift(i).flatMap(_.lift(j)).map(f).getOrElse(false) 

Anahtar fikir, Option paketinin kaldırılmasını (veya eşlemenin) Mümkün olduğunca Bu yaklaşım oldukça doğal olarak ikiden fazla boyuta yayılacaktır.

Bu cevap for -comprehension (Orada lift içerdiği anlamına varsayarak) eşdeğer oldukça yakın, ancak parantez içinde anlama sarmak zorunda kez şahsen şekeri alınmış sürümü daha net bulurlar.

+0

Fantastic - Opsiyonu tutmaya çalışıyordum ama liste kavramasının temellerini unuttum. Teşekkürler. – Stephen

+0

2.10 daha kısa versiyon: 'myVector.lift (i) .flatMap (_. Lift (j)) mevcut (f)' dir. – lpandzic

0

Ben biraz overkill gibi görünüyor olsa bile, zarif görünüyor figürlü bir şey var:

(for { 
    myVector2 <- myVector(i) 
    t <- myVector2(j) 
} yield t) map f getOrElse false 

bu mantıklı mı? Kesinlikle okunabilir. Yavaş mı? fold Scala 2.10 kullanılmaya başlanmasından önceki,

myVector.lift(i).flatMap(_.lift(j)).fold(false)(f) 

Veya: şu şekildedir:

myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false 

Bu yazılabilir:

İlgili konular