Реалізуйте базові операції з масивами.
У функціональних мовах такі операції з масивами, як length, map і reduce, трапляються дуже часто.
Реалізуйте низку базових операцій з масивами, не використовуючи наявні функції.
Точна кількість і назви операцій, які потрібно реалізувати, залежать від конкретного треку, щоб уникнути конфліктів з наявними назвами, але загалом потрібно реалізувати такі операції:
append (отримавши два масиви, додати всі елементи другого масиву в кінець першого);concatenate (отримавши низку масивів, поєднати всі елементи з усіх масивів в один плаский масив);filter (отримавши предикат і масив, повернути масив усіх елементів, для яких predicate(item) є правдою);length (отримавши масив, повернути загальну кількість елементів у ньому);map (отримавши функцію і масив, повернути масив результатів застосування function(item) до всіх елементів);foldl (отримавши функцію, масив і початковий акумулятор, згорнути (звести) кожен елемент у акумулятор зліва);foldr (отримавши функцію, масив і початковий акумулятор, згорнути (звести) кожен елемент у акумулятор справа);reverse (отримавши масив, повернути масив з усіма початковими елементами, але у зворотному порядку).Зауважте, порядок, у якому аргументи передаються до функцій згортання (foldl, foldr), має значення.
Це перша вправа, у якій рішення, яке ми пишемо, не є «головним» скриптом. Ми пишемо бібліотеку, яку підключають через «source» до інших скриптів, що викликають наші функції.
У цій вправі потрібно використовувати змінні nameref. Для цього потрібна версія bash не нижче 4.0. Якщо використовується стандартний bash на MacOS, потрібно встановити іншу версію: див. Встановлення Bash
Nameref-змінні дають змогу передати змінну у функцію за посиланням. Так змінну можна змінити у функції, і оновлене значення буде доступне в області видимості, з якої викликали функцію. Ось приклад:
prependElements() {
local -n __array=$1
shift
__array=( "$@" "${__array[@]}" )
}
my_array=( a b c )
echo "before: ${my_array[*]}" # => before: a b c
prependElements my_array d e f
echo "after: ${my_array[*]}" # => after: d e f a b c
Зареєструйтеся на Exercism, щоб вивчати й опановувати Bash, а також 97 вправ та справжнє наставництво від людей, і все це безкоштовно.
Насолоджуйтеся практичним вступом до рекурсії, розгляньте імперативні та функціональні альтернативи «Операціям з масивом» і зануртеся в хвостову рекурсію та функції-акумулятори.