Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación funcional / Generadores
gather perezoso
Un bloque gather es perezoso: no se ejecuta de
una vez. Produce valores solo a medida que se extraen, lo que significa
que un gather puede describir una serie sin
fin y seguir siendo útil: simplemente dejas de tomar valores
cuando ya tienes bastantes.
La trampa está en que debes mantener el resultado perezoso. Guardarlo
en un @array normal intentaría reunir todos los valores a
la vez, y para una serie sin fin eso no termina nunca. En su lugar,
mantén la secuencia en un escalar (donde sigue siendo una
Seq perezosa) y extrae de ella una porción:
my $naturals = gather {
my $n = 1;
loop {
take $n++;
}
}
say $naturals[^5]; # (1 2 3 4 5)El loop no termina nunca, pero solo se producen cinco
valores, porque es todo lo que pedimos con [^5]. También
puedes extraer desde el principio con .head:
say (gather { my $n = 1; loop { take $n++ } }).head(3); # (1 2 3)La pereza es lo que permite a gather modelar flujos
infinitos sin peligro: no se calcula nada hasta que hace falta, y tomas
exactamente tanto como quieras.
Navegación del curso
← Quiz — gather y take | Recoja los cubos →
💪 O ve directamente a los ejercicios de esta
sección.