i

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.

Idee des map-Operators[1]

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.

Signatur des map-Operators[2]

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.

Idee des filter-Operators[3]

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.

Signatur des filter-Operators[4]

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

Suche

v
110.2.10.3
inf-schule.de/fp_elm_alteversion/elm_programme/listenoperatoren/konzept_listenoperatoren
inf-schule.de/110.2.10.3
inf-schule.de/@/page/FD0XYsy6wPj1tRMZ

Rückmeldung geben