2009-03-19 4 views

ответ

14

В случае, когда it является Iterable

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

В случае, когда it является Iterator

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

Зная, кто вы (из списка рассылки scala-user), вы правы. Я уверен (не имею доступа к моему Scala dev envt на данный момент :-). Можете ли вы немного объяснить, как это работает. Я обещаю, что я не идиот, но я понятия не имею, как я должен был получить это от scaladoc. –

+0

Не будет ли это «it flatMap {_ elements}»? (Я снова прочитал скаладок!) –

+1

Было бы здорово увидеть больше гуру Scala на StackOverflow. Список рассылки scala-user заполняет мой почтовый ящик тайными аргументами из-за break/continue :-) –

10

В новых версиях это стало возможным:

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

Ну да, ТЕПЕРЬ. Когда вопрос был задан и ответил, это не сработало. (В случае, если вы не можете сказать, ваше использование слова «простой» подразумевает, что предыдущим участникам дискуссии удалось упустить простой ответ.) – extempore

+0

@extempore: Ты прав. Я исправил свой комментарий. – soc

5

Это работает для меня (Scala 2.8):

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

Для меня это классический прецедент для монадического интерфейса.

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

Это просто сахар для flatMap решения, описанного выше, и он производит идентичный байткод. Тем не менее, синтаксис имеет значение, и я думаю, что одним из лучших моментов использования синтаксиса Scala monadic for является то, что вы работаете с Option, особенно в сочетании с коллекциями.

Я думаю, что эта формулировка значительно читаема, особенно для тех, кто не очень хорошо разбирается в функциональном программировании. Я часто стараюсь как монадические, так и функциональные выражения цикла и вижу, что кажется более простым. Я думаю, flatMap - это тяжелое имя для большинства людей, чтобы получить (и на самом деле, называя его >>=, это делает более интуитивный смысл для меня).

Смежные вопросы