A map
не возвращает List
, а скорее Seq
.Seq
- это последовательность значений Iterable
в один прием, и в контексте приемника она будет выполнять итерацию своего базового итератора и отбрасывать полученные значения.Вот почему map
в контексте приемника будет повторяться, но только на один уровень глубины.Добавьте .flat
, чтобы поглотить даже внутренние значения (сведя их в одну последовательность верхнего уровня):
<foo bar ber>.map({ $^a.comb.map: { $^b.say}}).flat # OUTPUT: «foobarber»
A List
действительно не будет повторять свои значения в контексте приемника, потому что List
- это структура данных, которая запоминает даже ленивые значения, чтобы их можно было многократно индексировать.Действительно, выполнение:
(<foo bar ber>.map: *.say).list;
Не производит вывода, потому что Seq
был приведен к List
, который ничего не делает в контексте приемника.
Очень мало встроенных операций надПовторяемые данные возвращают List
, так как было бы преждевременным обязательством сохранять данные.Часто бывает полезно объединить такие операции в цепочку и получить поток данных через них по одному элементу, а не хранить их в памяти на каждом промежуточном этапе.Это то, что позволяет Seq
, и почему так много вещей возвращают его вместо List
.