Реалізуйте базові операції з масивами.
У функціональних мовах такі операції з масивами, як length, map і reduce, трапляються дуже часто.
Реалізуйте низку базових операцій з масивами, не використовуючи наявні функції.
Точна кількість і назви операцій, які потрібно реалізувати, залежать від конкретного треку, щоб уникнути конфліктів з наявними назвами, але загалом потрібно реалізувати такі операції:
append (отримавши два масиви, додати всі елементи другого масиву в кінець першого);concatenate (отримавши низку масивів, поєднати всі елементи з усіх масивів в один плаский масив);filter (отримавши предикат і масив, повернути масив усіх елементів, для яких predicate(item) є правдою);length (отримавши масив, повернути загальну кількість елементів у ньому);map (отримавши функцію і масив, повернути масив результатів застосування function(item) до всіх елементів);foldl (отримавши функцію, масив і початковий акумулятор, згорнути (звести) кожен елемент у акумулятор зліва);foldr (отримавши функцію, масив і початковий акумулятор, згорнути (звести) кожен елемент у акумулятор справа);reverse (отримавши масив, повернути масив з усіма початковими елементами, але у зворотному порядку).Зауважте, порядок, у якому аргументи передаються до функцій згортання (foldl, foldr), має значення.
Наведені вище інструкції синхронізовано зі спільним репозиторієм, щоб забезпечити узгодженість між усіма мовними треками. Цей додаток дає додаткові пояснення або змінює інструкції в міру потреби, щоб краще узгодити їх із цілями треку Clojure.
Для цієї вправи в треку Clojure вважайте, що і вхідні, і вихідні дані є векторами, як зазначено в тестах. Як додаткове завдання, поміркуйте, як реалізувати підхід, який не використовує списки на проміжних кроках.
Важливо не використовувати повторно наявні вбудовані функції Clojure зі схожою функціональністю, оскільки це применшило б заплановану навчальну цінність вправи.
Ключові функції з простору імен clojure.core, яких варто уникати, включають into, concat, cat, lazy-cat, mapcat, flatten, filter, filterv, remove, count, map, mapv, reduce, transduce, reverse і rseq.
Необовʼязкова мета призначена для тих, хто хоче додаткового виклику, і розрахована на те, що основну мету вже виконано.
Спробуйте пройти тести, придумавши підхід, який припускає:
Якщо вирішите опублікувати це, обовʼязково додайте коментар, який зазначає, що це стосується необовʼязкової мети використання списків. Не забудьте оновити докстрінги!
Зареєструйтеся на Exercism, щоб вивчати й опановувати Clojure, а також 12 концепцій105 вправ та справжнє наставництво від людей, і все це безкоштовно.
Насолоджуйтеся практичним вступом до рекурсії, розгляньте імперативні та функціональні альтернативи «Операціям з масивом» і зануртеся в хвостову рекурсію та функції-акумулятори.