Toutes les fonctions du module Enum sont strictes. Lorsqu'on effectue plusieurs opérations sur des énumérables avec le module Enum, chaque opération va générer un résultat intermédiaire.
Le module Stream est une alternative paresseuse au module Enum strict. Il propose bon nombre des mêmes fonctions que Enum, mais au lieu de générer des résultats intermédiaires, il construit une série de calculs qui ne sont exécutés qu'une fois que le flux est transmis à une fonction du module Enum.
Les flux implémentent le protocole Enumerable et sont composables : on peut les enchaîner pour créer des fonctionnalités plus complexes.
Tu es un immense fan de la chaîne YouTube Numberphile et tu viens de voir une chouette vidéo sur la suite de Lucas. Tu veux créer cette suite avec Elixir.
Pendant que tu conçois ta fonction, tu veux tirer parti de l'évaluation paresseuse pour pouvoir générer autant de nombres que tu le souhaites, mais seulement si tu en as besoin. Tu décides donc d'utiliser un stream.
Ajoute une clause de garde pour lever une erreur si un non-entier ou un entier inférieur à 1 est utilisé pour générer la suite. Faire cela dès la première étape évitera des bugs de récursion infinie dans les étapes suivantes.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
Tu sais que la suite possède deux nombres de départ qui ne suivent pas la même règle. Écris deux clauses de cas de base pour renvoyer ces nombres :
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
Pour toute suite de plus de 2 éléments, tu sais qu'il faut additionner les deux nombres précédents pour obtenir le nombre suivant, et ainsi de suite. Écris le cas généralisé.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.