Усі функції в модулі Enum жадібні. Коли ми виконуємо кілька операцій над перелічуваними значеннями за допомогою модуля Enum, кожна операція створює проміжний результат.
Модуль Stream - це лінива альтернатива жадібному модулю Enum. Він пропонує багато тих самих функцій, що й Enum, але замість створення проміжних результатів будує низку обчислень, які виконуються лише тоді, коли потік передають до функції з модуля Enum.
Потоки реалізують протокол Enumerable і є компонованими: ми можемо обʼєднувати їх у ланцюжки, щоб створювати складнішу функціональність.
Ми великі шанувальники YouTube-каналу Numberphile й щойно побачили круте відео про послідовність чисел Лукаса. Ми хочемо створити цю послідовність за допомогою Elixir.
Розробляючи функцію, хочемо скористатися лінивим обчисленням, щоб генерувати скільки завгодно чисел, але лише за потреби. Тож вирішуємо використати потік.
Додайте захисну клаузу, щоб виникала помилка, якщо для генерації послідовності використано неціле число або ціле число, менше ніж 1. Якщо зробити це першим кроком, це запобіжить помилкам нескінченної рекурсії на наступних кроках.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
Ми знаємо, що послідовність має два початкові числа, які не підкоряються тому самому правилу. Напишіть дві клаузи базових випадків, щоб повернути ці числа:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
Для будь-якої послідовності довшої за 2 ми знаємо, що треба додати два попередні числа, щоб отримати наступне число, і так далі. Напишіть узагальнений випадок.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.