В функциональном программировании , фильтр является функция высшего порядка , который обрабатывает структуру данных (обычно список ) в каком - то для того , чтобы произвести новую структуру данных , содержащую именно те элементы исходной структуры данных , для которых данный предикат возвращает логическое значение 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 обеспечивает реализацию фильтра для языковой схемы . [6] C ++ предоставляет алгоритмы remove_if
(изменяющиеся) и remove_copy_if
(неизменяемые); C ++ 11 дополнительно предоставляет copy_if
(без мутаций). [7] Smalltalk предоставляет select:
метод для коллекций. Фильтр также может быть реализован с использованием списков на языках, которые их поддерживают.
В Haskell filter
это можно реализовать так:
filter :: ( a -> Bool ) -> [ a ] -> [ a ] filter _ [] = [] filter p ( x : xs ) = [ x | p x ] ++ фильтр p xs
Здесь []
обозначает пустой список, ++
операцию конкатенации списков и [x | p x]
обозначает список, в котором условно содержится значение x
, если условие p x
выполняется (оценивается как True
).
Язык | Фильтр | Заметки | |
---|---|---|---|
APL | (pred array)/array | ||
C # 3.0 | ienum.Where(pred) или раздел where | Где находится метод расширения ienum - это IEnumerable Аналогично на всех языках .NET | |
CFML | obj.filter(func) | Где obj массив или структура. func Принимает в качестве аргумента значение каждого элемента. | |
Clojure | (filter predicate list)[8] | Или, через понимание списка :(for [x list :when (pred x)] x) | |
Common Lisp | (remove-if inverted-pred list) | Функция remove-if-not устарела [5] в пользу эквивалента, в remove-if котором предикат дополняется. [9] Таким образом, фильтр (remove-if-not #'oddp '(0 1 2 3)) следует записать (remove-if (complement #'oddp) '(0 1 2 3)) или проще: (remove-if #'evenp '(0 1 2 3)) где evenp возвращает инвертированное значение oddp . [10] | |
C ++ | std::remove_copy_if(begin, end, result, prednot) | в заголовке <алгоритм> начало , конец , результат - предикат итератора перевернут | |
D | std.algorithm.filter!(pred)(list) | ||
Erlang | lists:filter(Fun, List) | Или, через понимание списка :[ X || X <- List, Fun(X) ] | |
Groovy | list.findAll(pred) | ||
Haskell | filter pred list | Или, через понимание списка :[x | x <- list, pred x] | |
Haxe | list.filter(pred) Lambda.filter(list, pred) | Или, через понимание списка :[x | x <- list, pred x] | |
J | (#~ pred) list | Пример монадического крючка. # - копия, ~ меняет аргументы.(f g) y = y f (g y) | |
Юлия | filter(pred, array) | Функция фильтра также принимает dict тип данных. Или, через понимание списка :[x for x in array if pred(x)] | |
Java 8+ | stream.filter(pred) | ||
JavaScript 1.6 | array.filter(pred) | ||
Котлин | array.filter(pred) | ||
Mathematica | Select[list, pred] | ||
Objective-C ( какао в Mac OS X 10.4+) | [array filteredArrayUsingPredicate:pred] | pred является объектом NSPredicate , выразительность которого может быть ограничена. | |
F # , OCaml , Стандартный ML | List.filter pred list | ||
PARI / GP | select(expr, list) | Порядок аргументов обратный в версии 2.4.2. | |
Perl | grep block list | ||
PHP | array_filter(array, pred) | ||
Пролог | filter(+Closure,+List,-List) | Начиная с ISO / IEC 13211-1: 1995 / Cor.2: 2012 [11], основной стандарт содержит приложение закрытия через call/N [12] | |
Python | filter(func, list) | Или, с помощью списка понимания : . В Python 3 было изменено возвращать итератор, а не список. [13] Дополнительные функции, возвращающие итератор по элементам, для которых предикат ложен, также доступны в стандартной библиотеке, как и в модуле.[x for x in list if pred(x)] filter filterfalse itertools | |
Рубин | enum.find_all {block} | enum это перечисление | |
Ржавчина | iterator.filter(pred) | iterator является Iterator и filter метод возвращает новый итератор; pred - это функция (в частности FnMut ), которая получает элемент итератора и возвращаетbool | |
S , R | Filter(pred,array) | Во втором случае pred должна быть векторизованной функцией | |
Scala | list.filter(pred) | Или через понимание: for(x <- list; if pred) yield x | |
Схема R 6 RS | (filter pred list) (remove inverted pred list) (partition pred list list) | ||
Болтовня | aCollection select: aBlock | ||
Быстрый | array.filter(pred) | ||
XPath , XQuery | list[block] filter(list, func) | В block элементе контекста . хранится текущее значение |
Варианты
Фильтр создает свой результат без изменения исходного списка. Многие языки программирования также предоставляют варианты, которые вместо этого деструктивно изменяют аргумент списка для повышения производительности. Другие варианты фильтра (например, Haskell dropWhile
[14] и partition
[15] ) также распространены. Общая оптимизация памяти для чисто функциональных языков программирования заключается в том, чтобы у входного списка и отфильтрованного результата был общий самый длинный общий хвост ( разделение хвостов ).
Смотрите также
- Карта (функция высшего порядка)
- Понимание списка
- Охрана (вычисления)
Рекомендации
- ^ filter в Прелюдии к Haskell Standard
- ^ filter вмодуле стандартной библиотеки OCaml
list
- ^ "Структура списка" . Стандартная базовая библиотека машинного обучения . Проверено 25 сентября 2007 . CS1 maint: обескураженный параметр ( ссылка )
- ^ filter/2 в документации модуля Erlang STDLIB Reference Manual
lists
- ^ a b Функция REMOVE, REMOVE-IF, REMOVE-IF-NOT, DELETE, DELETE-IF, DELETE-IF-NOT в Common Lisp HyperSpec
- ^ filter в SRFI 1
- ^ remove_if иremove_copy_ifвспецификации стандартной библиотеки шаблонов SGI(STL)
- ^ clojure.core / filter в ClojureDocs
- ^ Функция COMPLEMENT в 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 . Проверено 28 октября 2020 .
- ^ Удаление фильтра Haskell
- ^ Раздел фильтра Haskell