2012-10-04 8 views
6

Zasadniczo chcę wyodrębnić kilka opcji a, b itd. Czy jest to najlepszy sposób na zrobienie tego w Scali? Wydaje mi się to trochę mylące, gdybym miał for-yield w nawiasie.Czy istnieje paradigmatyczna Scala dla yield-getOrElse, czy jest lepszy sposób?

(for { 
    a <- a 
    b <- b 
    c <- c 
    ... 
} yield { 
    ... 
}) getOrElse { 
    ... 
} 
+2

Wygląda na to, że nie osiągniesz lepszych rezultatów dzięki * core * scala, ale możliwe, że [spróbujesz skalazu] (http://www.casualmiracles.com/2012/01/16/a-small -example-of-aplikatory-funktory-z-scalaz /)? –

+0

Przykład "skalazu" tak naprawdę nie dotyczy tego scenariusza, ale zamiast niego 3 niezależne opcje; tutaj pytanie dotyczy opcji zagnieżdżonych; czy czegoś brakuje? –

+0

Nie wydaje mi się, żeby było cokolwiek złego w zaimplementowaniu w zawiłości w parens, to wyrażenie jak każde inne. Ciągle to robię. –

Odpowiedz

6

Spróbuj użyć map i flatMap zamiast. Zakładam, że masz następujące klasy hierarchii:

case class C(x: Int) 
case class B(c: Option[C]) 
case class A(b: Option[B]) 

val a = Some(A(Some(B(Some(C(42)))))) 

W celu wydobycia 42 można powiedzieć:

a.flatMap(_.b).flatMap(_.c).map(_.x).getOrElse(-1) 

Jest to z grubsza odpowiednik:

for(
    a <- a 
    b <- a.b 
    c <- b.c) 
     yield c.x 

z wyjątkiem tego, że zwraca Some(42). Rzeczywiście, zrozumienie for jest w rzeczywistości tłumaczone na sekwencje wywołań map/flatMap.

+0

, więc będzie łańcuch płaskich map/map? (Garret napisał "...", więc sądzę, że będzie więcej niż dwie opcje). –

+0

A co z c, d, etc? A co jest paradygmatyczne, jeśli jest coś takiego w Scali? –

+0

@ om-nom-nom: Przeformułowałem mój przykład, aby jasno wskazać, w jaki sposób stosuje się łańcuchowanie. –

Powiązane problemy