Einführung in die Funktionale Programmierung Grundsätze: Vergleich der Paradigmen imperative Programmierung Programme sind Definitionen einer konkreten Handlungsfolge. Das Ausführen bedeutet stets Veränderungen von Speicherzellen. Variablen (Speicherzellen) werden Werte zugewiesen und können überschrieben werden (destruktive Operationen). Schleifen für Wiederholungen Anwendungen: Interaktion mit Benutzer, graphische Oberflächen funktionale Programmierung "Programme" sind Sammlungen von Funktionsdefinitionen, die sich aufeinander beziehen können. Das Ausführen eines Programms bedeutet das Auswerten eines Funktionsausdrucks mit konkreten Argumenten. Es gibt keine Variablen, keine Zuweisungen. Rekursion ist das einzige Wiederholungskonstrukt dient der Entwicklung beweisbarer Algorithmen, als Prototyping-Werkzeug und als Spezifikationssprache + kurz, kompakt + Korrektheit von Algorithmen ist mathematisch beweisbar - Effizienz Quellen: Duden Informatik S. 280 ff Funktionsdefinitionen • • • Linke Seite: o Funktionsname, o einen oder mehrere Variablennamen als Argumente – durch Leerzeichen (Applikationsoperator) getrennt oder anstelle der Variablen o Muster. Definierendes Gleichheitszeichen Rechte Seite: o ein Ausdruck oder o ein bedingter Ausdruck mit Fallunterscheidungen (Guards). Einrückung beachten! 1. Explizite Funktionen Die Funktionsdefinition kann sofort ausgewertet werden. Aufgabe: Implementieren Sie die folgenden Funktionen, geben Sie den Typ an: • ist_zweistellig: liefert True, falls die Zahl zweistellig ist, • hoch3 berechnet die dritte Potenz einer Zahl, • ist_Vielfaches_von_8: liefert True, falls die Zahl durch 8 teilbar ist, • ist_Vielfaches_von: erhält zwei Zahlen a und b und liefert True, falls b durch a teilbar ist • die logischen Funktionen und, oder, nicht für die Eingaben 0 und 1 (Musteranpassung). 2. Rekursive Funktionen (Standardfall in der funktionalen Programmierung) Auf der rechten Seite der rekursiven Definition kommt mindestens einmal die zu definierende Funktion vor. Prinzip: Rekursionsanker: Abbruchbedingung für die Rekursion Rekursionsschritt: Rechnung und Funktionsaufruf mit reduziertem Problem Bespiel Fakultät: Musteranpassung: Guards: fak1 1 = 1 fak2 x | x==1 =1 fak1 x = x*fak1 (x-1) | otherwise = x*fak2(x-1) Listen sind Paradebeispiele für rekursive Datenstrukturen. Listen bestehen aus einem Listenkopf, an dem mit dem Konstruktor "cons" ein Schwanz angehängt ist, der wieder eine Liste ist. Die Darstellung erfolgt so: x:xs, wobei x für ein Listenelement steht und xs für die Restliste, die auch leer sein kann. Die einelementige Liste wird so dargestellt: [x], die leere Liste []. Beispiele für Listen sind Zeichenketten und Listen von ganzen Zahlen. Hier einige sind Aufgaben zum Üben des Umgangs mit Listen und der Musteranpassung. Gesucht sind die Typen und die Implementierung der folgenden Funktionen: 1. Berechne die Länge einer Liste (laenge) 2. Berechne das Maximum der Elemente einer Liste (maxi). 3. Berechne die Anzahl des Auftretens eines Elements in der Liste (anzEl). 4. dupliziere liefert eine Liste, in der alle Elemente dupliziert sind. 5. loesche erhält ein Listenelement, das danach nicht mehr in der Liste enthalten ist. J. Geschinsky Archenhold-Oberschule LK- Informatik Einführung Haskell