Todas las funciones del módulo Enum son inmediatas. Cuando realizas varias operaciones sobre enumerables con el módulo Enum, cada operación va a generar un resultado intermedio.
El módulo Stream es una alternativa perezosa al módulo Enum, que es inmediato. Ofrece muchas de las mismas funciones que Enum, pero en lugar de generar resultados intermedios, construye una serie de cálculos que solo se ejecutan una vez que el flujo se pasa a una función del módulo Enum.
Los flujos implementan el protocolo Enumerable y son componibles: puedes encadenarlos para crear una funcionalidad más compleja.
Eres un gran fan del canal de YouTube de Numberphile y acabas de ver un vídeo genial sobre la sucesión de números de Lucas. Quieres crear esta sucesión usando Elixir.
Mientras diseñas tu función, quieres aprovechar la evaluación perezosa, para poder generar tantos números como quieras, pero solo si los necesitas. Así que decides usar un stream.
Añade una cláusula de guarda para lanzar un error si se usa un valor que no sea un número entero, o un número entero menor que 1, para generar la sucesión. Hacerlo como primer paso evitará errores de recursión infinita en los pasos posteriores.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
Sabes que la sucesión tiene dos números iniciales que no siguen la misma regla. Escribe dos cláusulas de caso base que devuelvan estos números:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
Para cualquier sucesión de más de 2 números, sabes que tienes que sumar los dos números anteriores para obtener el siguiente, y así sucesivamente. Escribe el caso generalizado.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.