Фильтр (функция высшего порядка) - Filter (higher-order function)
В функциональное программирование, фильтр это функция высшего порядка который обрабатывает структура данных (обычно список ) в некотором порядке для создания новой структуры данных, содержащей именно те элементы исходной структуры данных, для которых заданная предикат возвращает логическое значение истинный
.
Пример
В Haskell, пример кода
фильтр четное [1..10]
вычисляет список 2, 4,…, 10, применяя предикат четное
для каждого элемента списка целых чисел 1, 2,…, 10 в указанном порядке и создания нового списка тех элементов, для которых предикат возвращает логическое значение true, тем самым давая список, содержащий только четные элементы этого списка. И наоборот, пример кода
фильтр (нет . четное) [1..10]
вычисляет список 1, 3,…, 9, собирая те элементы списка целых чисел 1, 2,…, 10, для которых предикат четное
возвращает логическое значение false (с .
будучи оператор композиции функции ).
Наглядный пример
Ниже вы можете увидеть представление каждого шага процесса фильтрации для списка целых чисел. X = [0, 5, 8, 3, 2, 1]
по функции:
Эта функция выражает, что если даже возвращаемое значение , иначе это . Это предикат.
Сравнение языков
Фильтр - стандартная функция для многих языки программирования, например, Haskell,[1]OCaml,[2]Стандартный ML,[3]или же Erlang.[4]Common Lisp предоставляет функции удалить-если
и удалить, если нет
.[5]Схема запросов на реализацию (SRFI) 1 предоставляет реализацию фильтра для языка Схема.[6]C ++ обеспечивает алгоритмы remove_if
(мутации) и remove_copy_if
(без мутации); C ++ 11 дополнительно предоставляет copy_if
(без мутации).[7] Болтовня обеспечивает Выбрать:
метод для коллекций. Фильтр также можно реализовать с помощью составить список на языках, которые их поддерживают.
В Haskell, фильтр
можно реализовать так:
фильтр :: (а -> Bool) -> [а] -> [а] фильтр _ [] = [] фильтр п (Икс:хз) = [Икс | п Икс] ++ фильтр п хз
Здесь, []
обозначает пустой список, ++
операция конкатенации списков и [x | p x]
обозначает список, в котором условно содержится значение, Икс
, если условие p x
держит (оценивается как Истинный
).
Язык | Фильтр | Примечания | |
---|---|---|---|
APL | (пред множество)/множество | ||
C # 3.0 | ienum.Где(пред) или же В куда пункт | Где метод расширения ienum это IEnumerable Аналогично на всех языках .NET | |
CFML | obj.filter (функция) | Где объект это массив или структура. В func получает в качестве аргумента значение каждого элемента. | |
Clojure | (фильтр предикат список)[8] | Или через понимание списка: (для [x список :когда (пред х)] х) | |
Common Lisp | (удалить-если перевернутый пред список) | Функция удалить, если нет устарел[5] в пользу эквивалентного удалить-если где предикат дополняется.[9] Таким образом, фильтр (удалить-если-не # 'oddp' (0 1 2 3)) должен быть написан (удалить-если (дополнение # 'oddp)' (0 1 2 3)) или проще: (удалить-если # 'evenp' (0 1 2 3)) куда даже возвращает инвертированное значение странный .[10] | |
C ++ | std :: remove_copy_if (начинать, конец, результат, предно) | в заголовке <алгоритм> начинать, конец, результат итераторы предикат перевернут | |
D | std.algorithm.filter! (пред)(список) | ||
Erlang | списки: фильтр (Весело, Список) | Или через понимание списка: [X || X <- Список, Развлечения (X)] | |
Groovy | список.найти все(пред) | ||
Haskell | фильтр пред список | Или через понимание списка: [x | х <- список, пред Икс] | |
Haxe | список.фильтр(пред) Лямбда.фильтр (список, пред) | Или через понимание списка: [x | х <- список, пред Икс] | |
J | (#~ пред) список | Пример монадического крючка. # копирует, ~ меняет аргументы. (f g) y = y f (g y) | |
Юля | фильтр(пред, множество) | Функция фильтра также принимает диктовать тип данных. Или через понимание списка: [Икс за Икс в множество если пред (х)] | |
Ява 8+ | транслировать.фильтр(пред) | ||
JavaScript 1.6 | множество.фильтр(пред) | ||
Котлин | множество.фильтр(пред) | ||
Mathematica | Выбирать[список, пред] | ||
Цель-C (Какао в Mac OS X 10.4+) | [множество filterArrayUsingPredicate:пред] | пред является NSPredicate объект, который может быть ограничен в выразительности | |
F #, OCaml, Стандартный ML | List.filter пред список | ||
PARI / GP | Выбрать(expr, список) | Порядок аргументов обратный в версии 2.4.2. | |
Perl | grep блокировать список | ||
PHP | array_filter (множество, пред) | ||
Пролог | фильтр (+ закрытие, + список, -список) | Начиная с ISO / IEC 13211-1: 1995 / Cor.2: 2012[11] основной стандарт содержит приложение закрытия через звонок / N [12] | |
Python | фильтр(func, список) | Или через понимание списка: [x вместо x в список если пред(Икс)] . В Python 3 фильтр был изменен, чтобы вернуть итератор а не список.[13] Дополнительные функции, возвращающие итератор по элементам, для которых предикат равен false, также доступны в стандартной библиотеке как filterfalse в itertools модуль. | |
Рубин | перечислить.найти все {блокировать} | перечислить это перечисление | |
Ржавчина | итератор.фильтр(пред) | итератор является Итератор и фильтр метод возвращает новый итератор; пред это функция (в частности FnMut ), который получает элемент итератора и возвращает bool | |
S, р | Фильтр(пред,множество) | Во втором случае пред должна быть векторизованной функцией | |
Scala | список.фильтр(пред) | Или, через понимание: для (x <- список; если пред) yield x | |
Схема р6RS | (фильтр пред список) (удалять перевернутый пред список) (раздел пред список список) | ||
Болтовня | Коллекция Выбрать: Блок | ||
Быстрый | множество.фильтр(пред) | ||
XPath, XQuery | список [блок] фильтр (список, функция) | В блокировать элемент контекста . содержит текущее значение |
Варианты
Фильтр создает свой результат без изменения исходного списка. Многие языки программирования также предоставляют варианты, которые вместо этого деструктивно изменяют аргумент списка для повышения производительности. Другие варианты фильтра (например, Haskell dropWhile
[14] и раздел
[15]) также распространены. Обычный оптимизация памяти за чисто функциональные языки программирования состоит в том, чтобы входной список и отфильтрованный результат имели самый длинный общий хвост (разделение хвоста ).
Смотрите также
Рекомендации
- ^
фильтр
в стандартной прелюдии Haskell - ^
фильтр
в OCaml стандартный библиотечный модульсписок
- ^ «Структура списка». Стандартная базовая библиотека ML. Получено 2007-09-25.
- ^
фильтр / 2
в документации модуля Erlang STDLIB Reference Manual.списки
- ^ а б Функция REMOVE, REMOVE-IF, REMOVE-IF-NOT, DELETE, DELETE-IF, DELETE-IF-NOT в Common Lisp HyperSpec
- ^
фильтр
в СРФИ 1 - ^
remove_if
иremove_copy_if
в SGI Стандартная библиотека шаблонов (STL) спецификации - ^ clojure.core / filter в ClojureDocs
- ^ Функция ДОПОЛНЕНИЕ в Common Lisp HyperSpec
- ^ Функция EVENP, ODDP в Common Lisp HyperSpec
- ^ ISO / IEC 13211-1: 1995 / Cor 2: 2012
- ^ http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#call
- ^ «Встроенные функции - документация Python 3.9.0». docs.python.org. Получено 2020-10-28.
- ^ Фильтр Haskell dropWhile
- ^ Фильтр Haskell раздел