2009-03-19 16 views

Odpowiedz

14

W przypadku it stanowi Iterable

val it:Iterable[Option[T]] = ... 
it.flatMap(x => x)    //returns an Iterable[T] 

W przypadku it jest Iterator

val it:Iterator[Option[T]] = ... 
it.flatMap(x => x elements)  //returns an Iterator[T] 
it.flatMap(_ elements)    //equivalent 
+0

Wiedząc, kim jesteś (z listy mailingowej scala-user), masz rację Jestem pewien (nie mam dostępu do mojego dewelopera Scala w tej chwili :-). Czy możesz wyjaśnić nieco, jak to działa. Obiecuję, że nie jestem idiotą, ale nie mam pojęcia, jak powinienem dostać to ze skaladoku. –

+0

Czy nie byłoby to "flatMap {_ elements}"? (Znowu przeczytałem skaladok!) –

+1

Byłoby wspaniale zobaczyć więcej guru Scala na StackOverflow. Lista mailingowa scala-user zapełnia moją skrzynkę pocztową tajemnymi argumentami przez przerwę/kontynuację :-) –

10

W nowszych wersjach jest to teraz możliwe:

val it: Iterator[Option[T]] = ... 
val flatIt = it.flatten 
+1

No tak, TERAZ byś. Kiedy pytanie zadano i odebrano, to nie zadziałało. (W przypadku, gdy nie możesz powiedzieć, twoje użycie słowa "prosty" niesie ze sobą implikację, że poprzednim rozmówcom udało się przeoczyć prostą odpowiedź.) – extempore

+0

@extempore: Masz rację. Poprawiłem mój komentarz. – soc

5

ten działa dla mnie (Scala 2.8):

it.collect {case Some(s) => s} 
3

Dla mnie jest to klasyczny przypadek użycia monadycznego interfejsu użytkownika.

for { 
    opt <- iterable 
    t <- opt 
} yield t 

To właśnie cukier dla rozwiązania flatMap opisanej powyżej, a to wywołuje identyczną kodu bajtowego. Jednak składnia ma znaczenie i uważam, że jednym z najlepszych momentów użycia monostycznej składni Scala jest for, gdy pracujesz z Option, szczególnie w połączeniu z kolekcjami.

Myślę, że to sformułowanie jest znacznie bardziej czytelne, szczególnie dla osób niezbyt zaznajomionych z programowaniem funkcjonalnym. Często próbuję zarówno monadycznych, jak i funkcjonalnych wyrażeń pętli i widzę, co wydaje się bardziej proste. Myślę, że flatMap to trudne imię dla większości ludzi do grokowania (a tak naprawdę, wywołanie go >>= czyni mnie bardziej intuicyjnym).

Powiązane problemy