Racket: Фильтрация списков, filter
Функция map
может менять элементы списка, но не может менять их количество: сколько элементов было в исходном списке, столько же останется и в результирующем. Функция filter
же, напротив, не может менять сами элементы, но может решать, какие из них попадут в выходной список, а какие будут отброшены. Так map
и filter
, выполняя каждая свою задачу, взаимно дополняют друг-друга!
filter
Функция filter
принимает два аргумента:
- Функцию-предикат, которая должна вернуть
#t
для тех элементов, которые нужно оставить - Список элементов для последующего отбора
Результатом вызова filter
будет новый список, содержащий элементы, одобренные аргументом-предикатом.
Благодаря тому, что в Racket доступно великое множество функций-предикатов, использовать filter
легко и удобно:
(filter integer? (list 1 2.5 "foo" 7)) ; '(1 7)
(filter positive? (list -1 5 42 0 -100 3)) ; '(5 42 3)
Задание
Реализуйте функцию increment-numbers
, которая берёт из списка-аргумента значения, являющиеся числами (number?
) и возвращает список этих чисел, увеличив предварительно каждое число на единицу (add1
). Пример:
(increment-numbers (list 10 "foo" #f (list 2 3) 3/5)) ; '(11 8/5)
Заметьте, Racket умеет работать с дробями вроде
3/5
и8/5
!
Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.