sirve significa qué que para palabras ordenar opción nueva lista filtros filtro filtrar editar destinatarios definicion datos como campos asignar haskell filter

haskell - significa - ¿Cómo se combinan las condiciones del filtro?



para qué sirve la opción asignar campos (4)

La clase de funciones de filtro toma una condición (a -> Bool) y la aplica al filtrar.

¿Cuál es la mejor manera de usar un filtro cuando tiene múltiples condiciones?

Usé la función aplicativa liftA2 en lugar de liftM2 porque, por alguna razón, no entendía cómo liftM2 funcionaba dentro de código puro.


Bueno, puede combinar las funciones como desee en Haskell (siempre que los tipos sean correctos) y al usar lambdas no tiene que nombrar su función de predicado, es decir,

filter (/x -> odd x && x > 100) [1..200]


Digamos que sus condiciones están almacenadas en una lista llamada conditions . Esta lista tiene el tipo [a -> Bool] .

Para aplicar todas las condiciones a un valor x , puede usar el map :

map ($ x) conditions

Esto aplica cada condición a x y devuelve una lista de Bool. Para reducir esta lista a un solo booleano, Verdadero si todos los elementos son Verdaderos, y Falso de lo contrario, puede usar la función and :

and $ map ($ x) conditions

Ahora tienes una función que combina todas las condiciones. Vamos a darle un nombre:

combined_condition x = and $ map ($ x) conditions

Esta función tiene el tipo a -> Bool , por lo que podemos usarla en una llamada para filter :

filter combined_condition [1..10]


El combinador liftM2 se puede usar en la mónada Reader para hacer esto de una manera "más funcional":

import Control.Monad import Control.Monad.Reader -- .... filter (liftM2 (&&) odd (> 100)) [1..200]

Tenga en cuenta que las importaciones son importantes; Control.Monad.Reader proporciona la instancia de Monad (e ->) que hace que todo esto funcione.

La razón por la que funciona es que la mónada del lector es solo (e ->) para algún entorno e. Por lo tanto, un predicado booleano es una función monádica 0-ary que devuelve bool en un entorno correspondiente a su argumento. Luego podemos usar liftM2 para distribuir el entorno entre dos predicados de este tipo.

O, en términos más simples, liftM2 actuará de esta manera cuando los tipos funcionen:

liftM2 f g h a = f (g a) (h a)

También puede definir un nuevo combinador si desea poder encadenarlos fácilmente y / o no quiere meterse con liftM2:

(.&&.) :: (a -> Bool) -> (a -> Bool) -> (a -> Bool) (.&&.) f g a = (f a) && (g a) -- or, in points-free style: (.&&.) = liftM2 (&&) filter (odd .&&. (> 5) .&&. (< 20)) [1..100]


Si tiene una lista de funciones de filtrado de tipo a -> Bool y desea combinarlas en una función de filtrado concisa del mismo tipo, podemos escribir funciones para hacer solo. Cuál de las dos funciones siguientes que utilice dependerá del comportamiento de filtro que necesite.

anyfilt :: [(a -> Bool)] -> (a -> Bool) anyfilt fns = /el -> any (/fn -> fn el) fns allfilt :: [(a -> Bool)] -> (a -> Bool) allfilt fns = /el -> all (/fn -> fn el) fns

anyfilt devolverá verdadero si cualquiera de las funciones de filtro devuelve verdadero y falso si todas las funciones de filtro devuelven falso. allfilt devolverá verdadero si todas las funciones de filtro devuelven verdadero y falso si cualquiera de las funciones de filtro devuelve falso . Tenga en cuenta que no puede η reducir ninguna de las funciones, ya que las referencias a fns en el RHS están dentro de las funciones anónimas.

Úsalo así:

filterLines :: [String] -> [String] filterLines = let isComment = isPrefixOf "# " isBlank = (==) "" badLine = anyfilt([isComment, isBlank]) in filter (not . badLine) main = mapM_ putStrLn $ filterLines ["# comment", "", "true line"] --> "true line"