Ответ 1
Итак, я думаю, вы спрашиваете, возможно ли, чтобы оператор if
в целях понимания изменил тип результата. Ответ "да, но...".
Во-первых, поймите, как расширяются знания. Здесь обсуждаются вопросы о переполнении стека, и есть параметры, которые вы можете передать компилятору, чтобы он показал вам, что происходит.
В любом случае, этот код:
val evenColl = for { i <- collection if(Even) } yield i
Переводится как:
val evenColl = collection.withFilter(i => Even).map(i => i)
Итак, если метод withFilter
изменяет тип коллекции, он будет делать то, что вы хотите - в этом простом случае. В более сложных случаях это не будет работать:
for {
x <- xs
y <- ys
if cond
} yield (x, y)
переводится как
xs.flatMap(ys.withFilter(y => cond).map(y => (x, y)))
В этом случае flatMap
определяет, какой тип будет возвращен. Если он берет сигнал от того, какой результат был возвращен, он может работать.
Теперь, в Scala Collections, withFilter не изменяет тип коллекции. Вы могли бы написать свои собственные классы, которые могли бы это сделать, однако.