В функциональном программировании фильтр — это функция высшего порядка , которая обрабатывает структуру данных (обычно список ) в некотором порядке для создания новой структуры данных, содержащей именно те элементы исходной структуры данных, для которых данный предикат возвращает логическое значение true
.
В Haskell пример кода
фильтровать даже [ 1 .. 10 ]
вычисляет список 2, 4, …, 10, применяя предикат even
к каждому элементу списка целых чисел 1, 2, …, 10 в этом порядке и создавая новый список тех элементов, для которых предикат возвращает логическое значение true , тем самым создавая список, содержащий только четные элементы этого списка. И наоборот, пример кода
фильтр ( нет . даже ) [ 1 .. 10 ]
вычисляет список 1, 3, …, 9, собирая те элементы списка целых чисел 1, 2, …, 10, для которых предикат even
возвращает логическое значение false (который .
является оператором композиции функции ).
Ниже вы можете увидеть представление каждого шага процесса фильтрации для списка целых чисел X = [0, 5, 8, 3, 2, 1]
в соответствии с функцией:
Эта функция показывает, что если четно, то возвращаемое значение равно , в противном случае — . Это предикат.
Фильтр — стандартная функция для многих языков программирования , например, Haskell, [1] OCaml , [2] Standard ML , [3]
или Erlang . [4] Common Lisp предоставляет функции remove-if
и remove-if-not
. [5] Запросы на реализацию схемы (SRFI) 1 обеспечивают реализацию фильтра для языка Scheme . [6] C++ предоставляет алгоритмы remove_if
(мутирующие) и remove_copy_if
(немутирующие); C++11 дополнительно предоставляет copy_if
(немутирующий). [7] Smalltalk предоставляет select:
метод для коллекций. Фильтр также можно реализовать с использованием списков на языках, которые их поддерживают.
В Haskell это filter
можно реализовать так:
фильтр :: ( a -> Bool ) -> [ a ] -> [ a ] фильтр _ [] = [] фильтр p ( x : xs ) = [ x | p x ] ++ фильтр p xs
Здесь []
обозначает пустой список, ++
операцию объединения списков, и [x | p x]
обозначает список, условно содержащий значение, x
, если условие p x
выполняется (приводится значение True
).
Фильтр создает результат без изменения исходного списка. Многие языки программирования также предоставляют варианты, которые вместо этого деструктивно изменяют аргумент списка для повышения производительности. Другие варианты фильтров (например, Haskell dropWhile
[14] и partition
[15] ) также распространены. Общая оптимизация памяти для чисто функциональных языков программирования заключается в том, чтобы входной список и отфильтрованный результат имели самый длинный общий хвост ( tail-sharing ).
list
lists