[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