perl lazy-evaluation fibonacci perl6 raku

¿Cuántas formas existen para describir la secuencia de Fibonacci en Perl 6?



lazy-evaluation perl6 (2)

He estado buscando varias formas de construir listas perezosas en Perl 6 y me gustaría recopilar todas las formas concisas de describir la secuencia de Fibonacci.

Comenzaré con los tres del diario de masak :

my @fibs := (0, 1, -> $a, $b { $a + $b } ... *); my @fibs := (0, 1, { $^a + $^b } ... *); my @fibs := (0, 1, *+* ... *);

Estaba pensando que algo como esto también funcionaría, pero creo que tengo la sintaxis incorrecta:

my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));

Algo allí está ansioso (¿la porción?) Y hace que Rakudo entre en un bucle infinito. Es una traducción de la definición de Haskell:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Actualizar:

Parece que el problema con el ejemplo zipWith es el @fibs[1..*] . si tail se define como sub tail (@x) {my $i = 1; {@x[$i++]}...*} sub tail (@x) {my $i = 1; {@x[$i++]}...*} entonces funciona correctamente. Me interesaría saber por qué la división no es perezosa por parte de alguien familiarizado con los internos de Rakudo.

Otra bonita es:

my @fibs := (0, [/+] 1, @fibs);


El más corto parece ser

my @fibs := ^2,*+*...*;


Puede usar la magia de la proporción áurea: deje φ = (sqrt (5) +1) / 2, y defina fib (n) = (φ n + (1-φ) n ) / sqrt (5).

Puede convertir una función de este tipo en una lista perezosa de manera obvia: en Haskell, los siguientes trabajos:

fibs=genfibs 0 where genfibs n=(round (fib n)):genfibs (n+1)

Me temo que mi conocimiento de Perl 6 no está en condiciones de traducir esto, ¡lo siento! Cualquiera que edite esta respuesta para editar en los códigos ganará mi gratitud.

Una pregunta más de prueba sería enumerar formas de generar la lista perezosa de números de Hamming.