Итак, я думаю, что вы спрашиваете, возможно ли для оператора 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 withFilter не меняет тип коллекции . Однако вы можете написать свои собственные классы, которые будут это делать.