Пример:
for(x <- c1; y <- c2; z <- c3) yield {...}
что можно перевести на:
c1.flatMap(x => c2.flatMap(y => c3.map(z => {...})))
or:
for(x <- c1) for (y <- c2) for (z <- c3) yield {...}
Временная сложность составляет O(c1 * c2 * c3) согласно второму переводу, что, если c1, c2, c3 — очень большие числа?
Я попытался поискать в Интернете и обнаружил множество кодов, в которых генераторов гораздо больше, чем в этом примере.
Вопрос: В других языках мы хотим избежать вложенных циклов for, но почему scala разработала этот механизм, если в нем есть какие-то специальные приемы для обеспечения очень хорошей производительности вложенного цикла?
Если я что-то неправильно понимаю, скажите, пожалуйста, я хотел бы лучше знать for-comprehension в scala. Спасибо.
O(c1* c2*c3)
времени, и ни один язык ни с какими другими средствами не даст лучше. Но я чувствую, что вы воспринимаете для понимания как что-то идентичное циклам, хотя на самом деле это не так. Например, для таких коллекций, какList
, это может быть рекурсия, для вещей, отличных от коллекций, это будет совсем другая вещь. - person Alexander Arendar   schedule 14.09.2017