stringtranslate.com

Фильтр (функция высшего порядка)

В функциональном программировании фильтр это функция высшего порядка , которая обрабатывает структуру данных (обычно список ) в некотором порядке для создания новой структуры данных, содержащей именно те элементы исходной структуры данных, для которых заданный предикат возвращает логическое значение 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] Scheme Requests for Implementation (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 ).

Смотрите также

Ссылки

  1. ^ фильтр в Haskell Standard Prelude
  2. ^ фильтр в стандартном модуле библиотеки OCamllist
  3. ^ "Структура списка". Библиотека Standard ML Basis . Получено 25.09.2007 .
  4. ^ filter/2 в документации Erlang STDLIB Reference Manual модуляlists
  5. ^ ab Функция REMOVE, REMOVE-IF, REMOVE-IF-NOT, DELETE, DELETE-IF, DELETE-IF-NOT в Common Lisp HyperSpec
  6. ^ фильтр в SRFI 1
  7. ^ remove_if и remove_copy_if в спецификации библиотеки стандартных шаблонов SGI (STL)
  8. ^ clojure.core/filter на ClojureDocs
  9. ^ Функция КОМПЛЕМЕНТ в Common Lisp HyperSpec
  10. ^ Функция EVENP, ODDP в Common Lisp HyperSpec
  11. ^ ISO/IEC 13211-1:1995/Испр. 2:2012
  12. ^ «Проект технического исправления 2» .
  13. ^ "Встроенные функции — документация Python 3.9.0". docs.python.org . Получено 28.10.2020 .
  14. ^ Фильтр Haskell dropWhile
  15. ^ Раздел фильтра Haskell