Comment combinez-vous des conditions de filtre
La classe de filtre des fonctions d'une condition (a -> Bool) et l'applique lors du filtrage.
Quelle est la meilleure façon d'utiliser un filtre lorsque vous avez plusieurs conditions?
Utilisé la fonction applicative
liftA2 au lieu de liftM2 parce que je pour une raison quelconque ne pouvait pas comprendre comment liftM2 travaillé au sein du code pur.
Vous devez vous connecter pour publier un commentaire.
La liftM2 combinator peut être utilisé dans le Lecteur monade pour ce faire, en plus "fonctionnelle": les
Noter que les importations sont importantes; le Contrôle.Monade.Reader offre la Monade (e ->) instance qui fait cela tous les travaux.
La raison pour laquelle cela fonctionne est que le lecteur monade est juste (e ->) pour certains, l'environnement électronique. Ainsi, une valeur de type boolean prédicat est un 0-aire monadique de la fonction de retour bool dans un environnement correspondant à son argument. Nous pouvons ensuite utiliser liftM2 à distribuer de l'environnement plus de deux de ces prédicats.
Ou, en termes plus simples, liftM2 agira un peu comme ça quand les types de travail:
Vous pouvez également définir un nouveau combinateur si vous voulez être en mesure de la chaîne de ces facilement, et/ou ne voulez pas salir avec liftM2:
Control.Monad.Reader
.liftM2
peut (aujourd'hui) sera remplacé comme ceci:filter ((&&) <$> odd <*> (>100)) [1.200]
. Qui est la même, mais plus joli. 🙂 De plus, cela ne nécessiteControl.Applicative
, et pas des monades. ... Bien que je me demande encore quel opérateur permet ANDing plus de deux fonctions Booléennes...Bien, vous pouvez combiner des fonctions toutefois vous souhaitez en Haskell (aussi longtemps que les types sont corrects) et à l'aide de lambda vous n'avez même pas le nom de votre fonction de prédicat, c'est à dire,
Disons que vos conditions sont stockées dans une liste appelée
conditions
. Cette liste a le type[a -> Bool]
.À appliquer toutes les conditions pour une valeur
x
, vous pouvez utilisermap
:Cela s'applique chaque condition pour
x
et retourne une liste de Bool. Afin de réduire cette liste dans un booléen, Vrai si tous les éléments sont True et False dans le cas contraire, vous pouvez utiliser leand
fonction:Maintenant, vous avez une fonction qui combine toutes les conditions. Nous allons lui donner un nom:
Cette fonction est du type
a -> Bool
, donc on peut l'utiliser dans un appel àfilter
:all
fonction:filter (all conditions) [1..10]
filter (and . sequence conditions)
and $ map ($ x) conditions
il est possible de type:all ($ x) conditions
and (map ($ x) conditions)
peut être écritand (conditions ?? x)
avec(??)
Si vous avez une liste de fonctions de filtrage du type de
a -> Bool
et souhaitez les combiner en un seul concis fonction de filtrage du même type, on peut écrire des fonctions pour faire juste. Laquelle des deux fonctions ci-dessous que vous utilisez dépend du comportement de filtre dont vous avez besoin.anyfilt
sera de retour vrai si l'une des fonctions de filtre de retour vrai et false si toutes les fonctions de filtre de retour faux.allfilt
renvoie true si toutes les fonctions de filtre de retour vrai et faux si l'une des fonctions de filtre de retour faux.Notez que vous ne pouvez pas η-réduction soit la fonction que les références à
fns
sur les RHS sont à l'intérieur d'une fonction anonyme.L'utiliser comme ceci: