Можно ли использовать каналы с ленивыми списками? - PullRequest
8 голосов
/ 14 мая 2019

Это работает:

bastille% perl6 -e 'my @squares = (1...*).map({ $_ ** 2 }); say @squares[0..^10].join: ", "'
1, 4, 9, 16, 25, 36, 49, 64, 81, 100

Однако это не так:

bastille% perl6 -e 'my @squares <== map { $_ ** 2 } <== 1...*; say @squares[0..^10].join: ", "'
Cannot push a lazy list onto a Array
  in block <unit> at -e line 1

Почему это бросок? Есть ли способ, которым ленивые списки можно использовать с фидами?

1 Ответ

9 голосов
/ 14 мая 2019

Оператор подачи <== добавляет элементы в массив.

my @s <== ^3; 
@s <== <a>..<c>; 
say @s
[0 1 2 a b c]

Так

my @squares <== map { $_ ** 2 } <== 1...*;

работает аналогично

my @squares.append: map  * ** 2, 1..*;

Youможно использовать оператор присваивания элемента = с квадратными скобками

my @squares = ( map { $_ ** 2 } <== 1..* );

или следующий маленький хак

[=] my @squares <== map { $_ ** 2 } <== 1..*;
...