Ein Filter a b = F (a -> [b])
kapselt eine Funktion,
die aus einem a
eine Liste b
erzeugt.
Diese allgemeine Konstrukt wird für 4 Fälle verwendet:
a
, die darauf angewandte Funktion g hat aber nur ein a
als Parameter.
Defintionen zu Filtern
Filter a b = F (a -> [b]) | |
runFilter :: Filter a b -> a -> [b] | Führt einen Filter aus |
makeFilter :: (a -> [b]) -> Filter a b | Erzeugt einen neune Filter |
apFilter :: ([a] -> [b]) -> Filter c a -> Filter c b | |
wrap :: a -> [a] | Kapslet ein Element a in einer Liste von a |
(!>>=) :: [a] -> (a -> [b]) -> [b] | Erzeugt aus einer Liste a und einem Filter a b eine Liste von b |
Beispiel: Infix-Operator, Pattern-Matching, Filterfunktion
(!>>=) | :: [a] -> (a -> [b]) -> [b] |
[ ] | !>>= _ = [ ] |
[x] | !>>= f = f x |
(x:xs) | !>>= f = f x ++ (xs !>>= f) |
!>>=
definiert.
Die 3 Defineitionen werden alternativ per Pattern-Matching ausgewählt,
wobei sich das Pattern-Matching auf die Liste [a]
bezieht.
Ist die Liste leer, so wird eine leer Liste geliefert.
Anderenfalls wird erst das Kopfelemente mit der Funktion f
,
also (a -> [b])
bearbeitet und anschliessend der Rest der Liste rekursiv behandelt.
Um Filter beliebig miteinander kombinieren zu können, werden diese in einem Arrow gekapselt. Zwichen Arrows werden Operationen definiert. Mit diesen Operationen können dann die gekapselten Filter kombiniert werden. Folgend sind die Operationen auf Arrows und damit die Filterkombinatoren aufgelistet:
Algemeine Operationen
f >>> g | Rückgabewert von f ist Parameter von g. Es werden zwei Arrows aneinander gehängt. Umgekehrte Reihenfolge zum Operator fü Funktionskomposition |
arr f | die Funktion f in eine Arrow kapseln |
f +++ g | Ergebnisse von f, g werden aneinander gehängt |
Produkt-Kombinatoren
f >&< g | Parameter ist ein Paar. Erstes Element wird durch f, zweites durch g verarbeitet. Ergebnisse werden kombiniert |
f &&& g | Kartesisches Produkt, Rückgabewerte von f, g werden kombiniert |
apfst (f) | "Aply First", Parameter ist Paar. Erstes Element wird verändert, zweites wird durch gereicht |
apsnd (g) | "Aply Seconf", wie apfst (f), jedoch wird zweites Element bearbeitet |