En la programación funcional , el filtro es una función de orden superior que procesa una estructura de datos (generalmente una lista ) en algún orden para producir una nueva estructura de datos que contiene exactamente aquellos elementos de la estructura de datos original para los cuales un predicado dado devuelve el valor booleano true
.
Ejemplo
En Haskell , el ejemplo de código
filtrar incluso [ 1 .. 10 ]
evalúa la lista 2, 4,…, 10 aplicando el predicado even
a cada elemento de la lista de enteros 1, 2,…, 10 en ese orden y creando una nueva lista de aquellos elementos para los cuales el predicado devuelve el valor booleano verdadero , dando así una lista que contiene sólo los miembros pares de esa lista. Por el contrario, el ejemplo de código
filtro ( no . par ) [ 1 .. 10 ]
evalúa la lista 1, 3,…, 9 recolectando aquellos elementos de la lista de enteros 1, 2,…, 10 para los cuales el predicado even
devuelve el valor booleano falso ( .
siendo el operador de composición de la función ).
Ejemplo visual
A continuación, puede ver una vista de cada paso del proceso de filtrado para obtener una lista de enteros X = [0, 5, 8, 3, 2, 1]
según la función:
Esta función expresa que si es incluso el valor de retorno es , de lo contrario es . Este es el predicado.
Comparación de idiomas
El filtro es una función estándar para muchos lenguajes de programación , por ejemplo, Haskell, [1] OCaml , [2] Standard ML , [3] o Erlang . [4] Common Lisp proporciona las funciones remove-if
y remove-if-not
. [5] Solicitudes de implementación del esquema (SRFI) 1 proporciona una implementación de filtro para el esquema de lenguaje . [6] C ++ proporciona los algoritmos remove_if
(mutantes) y remove_copy_if
(no mutantes); C ++ 11 también proporciona copy_if
(no mutante). [7] Smalltalk proporciona el select:
método para las colecciones. El filtro también se puede realizar utilizando listas por comprensión en idiomas que las admitan.
En Haskell, filter
se puede implementar así:
filtro :: ( a -> Bool ) -> [ a ] -> [ a ] filtro _ [] = [] filtro p ( x : xs ) = [ x | p x ] ++ filtro p xs
Aquí, []
denota la lista vacía, ++
la operación de concatenación de lista y [x | p x]
denota una lista que contiene un valor x
condicionalmente, si la condición se p x
cumple (se evalúa como True
).
Idioma | Filtrar | Notas | |
---|---|---|---|
APL | (pred array)/array | ||
C # 3.0 | ienum.Where(pred) o la where cláusula | ¿Dónde hay un método de extensión? Ienum es un IEnumerable De manera similar en todos los lenguajes .NET | |
CFML | obj.filter(func) | Donde obj hay una matriz o una estructura. La func recibe como argumento el valor de cada elemento. | |
Clojure | (filter predicate list)[8] | O, a través de la comprensión de la lista :(for [x list :when (pred x)] x) | |
Lisp común | (remove-if inverted-pred list) | La función remove-if-not ha quedado obsoleta [5] a favor del equivalente remove-if donde se complementa el predicado. [9] Por lo tanto, el filtro (remove-if-not #'oddp '(0 1 2 3)) debe escribirse (remove-if (complement #'oddp) '(0 1 2 3)) o más simplemente: (remove-if #'evenp '(0 1 2 3)) donde evenp devuelve el valor invertido de oddp . [10] | |
C ++ | std::remove_copy_if(begin, end, result, prednot) | en el encabezado begin , end , result son iteradores, el predicado se invierte | |
D | std.algorithm.filter!(pred)(list) | ||
Erlang | lists:filter(Fun, List) | O, a través de la comprensión de la lista :[ X || X <- List, Fun(X) ] | |
Groovy | list.findAll(pred) | ||
Haskell | filter pred list | O, a través de la comprensión de la lista :[x | x <- list, pred x] | |
Haxe | list.filter(pred) Lambda.filter(list, pred) | O, a través de la comprensión de la lista :[x | x <- list, pred x] | |
J | (#~ pred) list | Un ejemplo de anzuelo monádico. # es copia, ~ invierte argumentos.(f g) y = y f (g y) | |
Julia | filter(pred, array) | La función de filtro también acepta dict tipos de datos. O, a través de la comprensión de la lista :[x for x in array if pred(x)] | |
Java 8+ | stream.filter(pred) | ||
JavaScript 1.6 | array.filter(pred) | ||
Kotlin | array.filter(pred) | ||
Mathematica | Select[list, pred] | ||
Objective-C ( Cocoa en Mac OS X 10.4+) | [array filteredArrayUsingPredicate:pred] | pred es un objeto NSPredicate , que puede tener una expresividad limitada | |
F # , OCaml , ML estándar | List.filter pred list | ||
PARI / GP | select(expr, list) | El orden de los argumentos se invierte en el v. 2.4.2. | |
Perl | grep block list | ||
PHP | array_filter(array, pred) | ||
Prólogo | filter(+Closure,+List,-List) | Desde ISO / IEC 13211-1: 1995 / Cor.2: 2012 [11], el estándar básico contiene la aplicación de cierre a través de call/N [12] | |
Pitón | filter(func, list) | O bien, a través de lista por comprensión : . En Python 3, se cambió para devolver un iterador en lugar de una lista. [13] La funcionalidad complementaria, que devuelve un iterador sobre elementos para los que el predicado es falso, también está disponible en la biblioteca estándar como en el módulo.[x for x in list if pred(x)] filter filterfalse itertools | |
Rubí | enum.find_all {block} | enum es una enumeración | |
Oxido | iterator.filter(pred) | iterator es un Iterator y el filter método devuelve un nuevo iterador; pred es una función (específicamente FnMut ) que recibe el elemento del iterador y devuelve unbool | |
S , R | Filter(pred,array) | En el segundo caso, pred debe ser una función vectorizada | |
Scala | list.filter(pred) | O, a través de la comprensión: for(x <- list; if pred) yield x | |
Esquema R 6 RS | (filter pred list) (remove inverted pred list) (partition pred list list) | ||
Charla | aCollection select: aBlock | ||
Rápido | array.filter(pred) | ||
XPath , XQuery | list[block] filter(list, func) | En block el contexto, el elemento . contiene el valor actual |
Variantes
Filter crea su resultado sin modificar la lista original. Muchos lenguajes de programación también proporcionan variantes que modifican destructivamente el argumento de la lista en lugar de un rendimiento más rápido. También son comunes otras variantes de filtro (por ejemplo, Haskell dropWhile
[14] y partition
[15] ). Una optimización de memoria común para lenguajes de programación puramente funcionales es hacer que la lista de entrada y el resultado filtrado compartan la cola común más larga ( cola compartida ).
Ver también
- Mapa (función de orden superior)
- Comprensión de listas
- Guardia (informática)
Referencias
- ^ filter en el Preludio estándar de Haskell
- ^ filter en elmódulo de biblioteca estándar OCaml
list
- ^ "La estructura de la lista" . La biblioteca básica de ML estándar . Consultado el 25 de septiembre de 2007 .
- ^ filter/2 en la documentación del módulo del Manual de referencia de Erlang STDLIB
lists
- ^ a b Función ELIMINAR, ELIMINAR-SI, ELIMINAR-SI-NO, ELIMINAR, ELIMINAR-SI, ELIMINAR-SI-NO en Common Lisp HyperSpec
- ^ filter en SRFI 1
- ^ remove_if yremove_copy_ifen laespecificaciónSGI Standard Template Library (STL)
- ^ clojure.core / filter en ClojureDocs
- ^ Función COMPLEMENTO en Common Lisp HyperSpec
- ^ Función EVENP, ODDP en Common Lisp HyperSpec
- ^ ISO / IEC 13211-1: 1995 / Cor 2: 2012
- ^ http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#call
- ^ "Funciones integradas - Documentación de Python 3.9.0" . docs.python.org . Consultado el 28 de octubre de 2020 .
- ^ Caída del filtro Haskell
- ^ Partición de filtro Haskell