Wie kombinieren Sie filter-Bedingungen
Filter Klasse von Funktionen nimmt einen Zustand (a -> Bool) und gilt es bei der Filterung.
Was ist der beste Weg, um einen filter auf, wenn Sie mehrere Bedingungen?
Verwendet der applicative-Funktion
liftA2 statt liftM2, weil ich aus irgendeinem Grund nicht verstehen, wie liftM2 arbeitete in reiner code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den liftM2 combinator können verwendet werden in der Reader-Monade zu tun, das in einer 'funktionaler' Weise:
Beachten Sie, dass die Importe sind wichtig; die Kontrolle.Monade.Leser bietet die Monade (e ->) Instanz, die macht das ganze funktioniert.
Den Grund, warum dies funktioniert, ist die reader-Monade ist gerade (e ->) für einige Umwelt e. So ein Boolesches Prädikat ist eine 0-fache monadischen Funktion Rückgabe bool in einer Umgebung entsprechend seiner Argumentation. Wir können dann liftM2 zu verteilen und die Umwelt über zwei solcher Prädikate.
Oder, in einfacheren Worten, liftM2 wird, wirken ein bisschen so, wenn die Typen arbeiten aus:
Können Sie auch definieren Sie einen neuen combinator, wenn Sie wollen in der Lage sein, um diese Kette leicht und/oder nicht zu verwirren wollen mit liftM2:
Control.Monad.Reader
.liftM2
können (heute) ersetzt werden, wie dies:filter ((&&) <$> odd <*> (>100)) [1.200]
. Das ist das gleiche, aber schöner. 🙂 Es werden auch nur benötigtControl.Applicative
und keine vollständigen Monaden. ... Obwohl ich mich noch Frage, was Betreiber ermöglicht die Verknüpfung von mehr als zwei Boolesche Funktionen...Gut, können Sie Funktionen kombinieren, aber Sie wollen in Haskell (solange die Typen sind korrekt) und mit lambdas Sie haben noch nicht einmal den Namen Ihrer Prädikat-Funktion, d.h.,
Lassen Sie uns sagen, dass Ihre Bedingungen gespeichert sind, in einer Liste genannt
conditions
. Diese Liste hat den Typ[a -> Bool]
.Gelten alle Bedingungen auf einen Wert
x
verwenden, können Siemap
:Dies gilt jede Bedingung zu
x
aus und liefert eine Liste von Bool. Reduzieren Sie diese Liste in einer einzelnen boolean-True, wenn alle Elemente Wahr sind, und False sonst, können Sie dieand
Funktion:Nun haben Sie eine Funktion, welche alle Bedingungen. Geben wir ihm einen Namen:
Diese Funktion hat den Typ
a -> Bool
, so können wir es in einem Aufruffilter
:all
Funktion:filter (all conditions) [1..10]
filter (and . sequence conditions)
and $ map ($ x) conditions
es ist möglich, Typ:all ($ x) conditions
and (map ($ x) conditions)
geschrieben werden könnenand (conditions ?? x)
mit(??)
Wenn Sie haben eine Liste von Filter-Funktionen vom Typ
a -> Bool
und wollen Sie zu kombinieren in einem kurzen Filterfunktion der gleichen Art können wir Funktionen schreiben zu tun. Welche der beiden folgenden Funktionen, die Sie verwenden, hängt vom filter-Verhalten, das Sie brauchen.anyfilt
zurück true, wenn der filter-Funktionen geben true zurück, und false, wenn alle filter-Funktionen false zurück.allfilt
true zurückgeben, wenn alle filter-Funktionen geben true zurück und false, wenn einer der filter-Funktionen false zurück.Beachten Sie, dass Sie nicht η-reduzieren Sie entweder die Funktion die Verweise auf
fns
auf RS sind innerhalb der anonymen Funktionen.Verwenden Sie es wie diese: