[OT?] Filter ;-) (Re: [linux-l] LinuxScript?)
Oliver Bandel
oliver at first.in-berlin.de
Fr Apr 5 16:48:08 CEST 2002
Hi,
On 5 Apr 2002, Soeren Sonnenburg wrote:
> > Denn dieser Thread dürfte sicherlich auch die anderen Nerven.
>
> Mich jedenfalls nicht, ich les mir das tatsaechlich durch. Filter den
> Thread doch und schon deine Nerven.
Filter?
...
Hat da wer Filter gesagt?
"Filtere alle Elemente, die eine bestimmte Eigenschaft haben
aus einer Liste heraus und gib diese Elemente als Liste zurück."
In Haskell:
filter p [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
Filter bekommt zwei Argumente:
1. Die Eigenschaft (property) p
2. Eine liste (Typ der Liste ist egal, wg. Haskells overloading)
Das erste Argument, die Property p ist eine Funktion.
Das zweite Argument, die Liste, ist eine Liste (wer hätte das Gedacht?;-))
a) Ist die Liste eine leere Liste, (erste Zeile), gibt filter eine,leere
Liste zurück.
b) ist die Liste nicht leer, gibt es zwei Fälle zu unterscheiden:
b1) Ausführen von p x , also property p mit Argument x aufrufen
ist True,
dann ist der Rückgabewert eine Liste mit einem
ersten Argument "x" und dem rest "filter p xs".
b2) otherwise (also p x ist False), dann wird der Rückgabewert
der sein, den "filter p xs" liefert; es wird also "x" nicht
in die Ergebnisliste kopiert.
Woher kommen x und xs?
Nun, also folgendermaßen:
In "filter p (x:xs)", also einem Teil der Fkt-Def. steht:
filter ist eine Funktion mit zwei Args., da erste ist ...
...das zweite ist eine Liste, di wir aufsplitten in ihr
erstes Element, das wir hier mit dem Namen "x" kennzeichnen
und den rest der Liste, den wir mit "xs" bezeichnen.
Ich kann mir bei bestem Willen nicht vorstellen, daß man
das in einer imperativen Sprache ähnlich gut formulieren kann
(Fragende Anmerkung: Evtl. Python?).
Falls doch, dann hilft der Nachbrenner, indem man das in Haskell
auch so formulieren kann (Achtung xs nicht mit obiger Def.
durcheinander bringen; es ist hier nur der Name der Input-Liste):
filter p xs = [ x | x <- xs, p x ]
Ich glaube, das ist das letzte Gebot. :)
Ciao,
Oliver
Mehr Informationen über die Mailingliste linux-l