Fachkonzept - Listenoperatoren
Die Grundidee
Bei der Verarbeitung von Listen gibt es Problemsituationen, die immer wieder - in abgwandelter Form - vokommen. Eine dieser Standardsituationen besteht darin, dass alle Elemente einer Liste mit derselben Funktion verarbeitet werden sollen. Für solche Standardsituationen gibt es vordefinierte Listenoperatoren, die man direkt in der betreffenden Situation anwenden kann. Die Operatoren sind so konzipiert, dass sie für beliebige Verarbeitungsfunktionen genutzt werden können. Mit dem Begriff Operator drückt man aus, dass hier beliegige Funktionen eingesetzt werden können. Die folgenden Ausführungen verdeutlichen diese Idee anhand der wichtigsten Listenoperatoren.
Der map-Operator
Der map
-Operator wird benutzt, wenn alle Elemente einer Liste mit derselben Funktion verarbeitet werden sollen.
Die Abbildung verdeutlicht diese Situation. Jede Zahl in der Liste soll mit einer vorgegebenen Funktion in die Gegenzahl umgewandelt werden.
Der folgende REPL-Dialog zeigt, wie einfach das mit dem map
-Operator umgesetzt werden kann.
> f x = -x
<function> : number -> number
> List.map f [3,0,-6,4]
[-3,0,6,-4] : List number
Diese Anwendung einer Funktion auf alle Listenelemente funktioniert bei beliebigen Datentypen.
> h s = "h" ++ s
<function> : String -> String
> List.map h ["a","e","i","o","u"]
["ha","he","hi","ho","hu"]
: List String
> List.map String.length ["Diese","Zeichenketten","sind","unterschiedlich","lang"]
[5,13,4,15,4] : List Int
Das spiegelt sich in der Signatur des map
-Operators wider.
> List.map
<function> : (a -> b) -> List a -> List b
Das Black-Box-Diagramm verdeutlicht die Übergaben und Rückgabe bei der Verwendung des map
-Operators.
Der map-Operator wendet eine übergebene Funktion, die Daten eines Typs a
in Daten eines Typs b
umwandelt,
auf alle Elemente einer Liste mit Daten vom Typs a
an und erzeugt so eine Liste mit Daten vom Typ b
.
Der filter-Operator
Der filter
-Operator wird benutzt, wenn Elemente einer Liste mit derselben Bedingungsfunktion herausgefiltert werden sollen.
Die Abbildung verdeutlicht diese Situation.
Der folgende REPL-Dialog zeigt, wie einfach das mit dem filter
-Operator umgesetzt werden kann.
> g x = (x>0)
<function> : number -> Bool
> List.filter g [3,0,-6,4]
[3,4] : List number
Diese Anwendung einer Bedingung auf alle Listenelemente funktioniert bei beliebigen Datentypen.
> k c = ((Char.toCode c) > 100)
<function> : Char -> Bool
> List.filter k ['K','u','K']
['u'] : List Char
Das spiegelt sich in der Signatur des map
-Operators wider.
> List.filter
<function> : (a -> Bool) -> List a -> List a
Das Black-Box-Diagramm verdeutlicht die Übergaben und Rückgabe bei der Verwendung des filter
-Operators.
Der filter-Operator wendet eine boolsche Funktion vom Typ a -> Bool
(als Bedingung)
auf alle Elemente einer Liste mit Daten vom Typs a
an und erzeugt so eine neue Liste, in der nur die Elemente der Ausgangsliste aufgenommen sind, die
die durch die boolsche Funktion beschriebene Bedingung erfüllen.
Quellen
- [1]: Idee des map-Operators - Urheber: KB - Lizenz: inf-schule.de
- [2]: Signatur des map-Operators - Urheber: KB - Lizenz: inf-schule.de
- [3]: Idee des filter-Operators - Urheber: KB - Lizenz: inf-schule.de
- [4]: Signatur des filter-Operators - Urheber: KB - Lizenz: inf-schule.de