С первого раза я прочитал, что:Scala для постижений и flatMap/карта промежуточные результаты
for {
harpo<-list1 if harpo.length>0
groucho<-list2
chico<-list3
} yield (harpo, groucho, chico)
переводит:
list1.filter(_.length>0).flatMap(harpo =>
list2.flatMap(groucho=>list3.map((harpo,groucho,_)))
)
Я беспокоился о ненужных промежуточных коллекций, возвращенных filter
, flatMap
& map
. Первый был зафиксирован в Scala 2.8 (?), Добавив метод withFilter
, и я подозреваю, что происходит некоторая магия, которая меняет тип возвращаемого значения этих методов в зависимости от использования, поэтому при использовании в качестве параметра flatMap
они возвращают не- строгая коллекция, но я не могу найти никаких доказательств. Являются ли мои подозрения правильными, и это не так неэффективно, как кажется на первый взгляд?
Возможно, я должен был быть более ясным. Мой вопрос: коллекции, возвращенные list3.map и list2.flatMap в этом случае строгие или нет? Если они строги, они многократно создаются, чтобы их отбросить после помещения их элементов в родительскую коллекцию. Если я просто делаю 'val l = list3.map (« brother »+ _)' Я получаю строгую коллекцию. Типичным примером C++ в таких случаях является использование ленивого промежуточного типа, который неявно трансформируется в строгий тип при назначении переменной ожидаемого типа возврата. Я не знаю, возможно ли это в scala, но для его вывода типа все еще есть секреты для меня. – Turin
'list2' и' list3', вероятно, строгие (вы не указываете их типы, но при условии, что они имеют тип 'List'), поэтому внутренние петли создают строгие промежуточные результаты. Я не знаю коллекций C++, но сомневаюсь, что вы можете разложить «flatMaps» ленивым способом, который устраняет любые промежуточные коллекции - __'map'__ и __'filter'__ yes, но не __'flatMap'__. Если вы этого хотите, используйте итерационный подход с построителем и 'foreach'. Как я уже сказал, не увлекайтесь преждевременными оптимизациями. –