Я рассматривал различные способы построения ленивых списков в Perl 6, и я хотел бы собрать все краткие способы описания последовательности Фибоначчи.
Я запустил это с помощью трех из masak:
my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);
my @fibs := (0, 1, { $^a + $^b } ... *);
my @fibs := (0, 1, *+* ... *);
Я думал, что что-то вроде этого тоже будет работать, но я думаю, что у меня синтаксис неправильный:
my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));
Что-то там нетерпеливо (срез?) и заставляет Rakudo вводить бесконечный цикл. Это перевод определения Хаскелла:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Update:
Похоже, проблема с примером zipWith
- это срез @fibs[1..*]
. если tail
определяется как sub tail (@x) {my $i = 1; {@x[$i++]}...*}
, то он работает правильно. Мне было бы интересно узнать, почему ломтик не ленится ни у кого, знакомого с внутренними силами Ракудо.
Еще один приятный вариант:
my @fibs := (0, [\+] 1, @fibs);