Funktionale Programmierung mit Haskell



Ähnliche Dokumente
Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:

ALP I. Funktionale Programmierung

Programmieren in Haskell Einführung

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Erwin Grüner

Funktionale Programmierung

Diana Lange. Generative Gestaltung Operatoren

Programmierkurs Java

Fragen. f [ ] = [ ] f (x : y : ys) = x y : f ys f (x : xs) = f (x : x : xs) Wozu evaluiert f [1, 2, 3] (Abkürzung für f (1 : 2 : 3 : [ ]))?

Modellierung und Programmierung 1

Einführung in die Programmierung

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

7 Rechnen mit Polynomen

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Einführung in die Java- Programmierung

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder

Einführung in das Programmieren Prolog Sommersemester Teil 2: Arithmetik. Version 1.0

Java-Programmierung mit NetBeans

1.5 Umsatzsteuervoranmeldung

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Einführung in die Programmierung (EPR)

Einführung in die C++ Programmierung für Ingenieure

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Mediator 9 - Lernprogramm

Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

1 Vom Problem zum Programm

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Verbesserungsdetails: PTC Mathcad Prime 3.0. Copyright 2013 Parametric Technology Corporation. weiter Infos unter

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

1. Probeklausur zu Programmierung 1 (WS 07/08)

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

RSA-Verschlüsselung. Verfahren zur Erzeugung der beiden Schlüssel:

Gussnummern-Lesesystem

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Modul 122 VBA Scribt.docx

SCHRITT 1: Öffnen des Bildes und Auswahl der Option»Drucken«im Menü»Datei«...2. SCHRITT 2: Angeben des Papierformat im Dialog»Drucklayout«...

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Excel Funktionen durch eigene Funktionen erweitern.

Wir arbeiten mit Zufallszahlen

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Eigenwerte und Eigenvektoren von Matrizen

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

15.3 Bedingte Wahrscheinlichkeit und Unabhängigkeit

Programmieren Tutorium

Übungen Programmieren 1 Felix Rohrer. Übungen

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

Java Kurs für Anfänger Einheit 5 Methoden

Einführung in die Programmierung

Angewandte Mathematik und Programmierung

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

R ist freie Software und kann von der Website.

Der Zwei-Quadrate-Satz von Fermat

Einführung in die Programmierung

Funktionale Programmierung mit Haskell. Jan Hermanns

Aufgabe 1: [Logische Modellierung]

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Grundlagen der Programmierung 2. Bäume

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Übungsaufgaben Tilgungsrechnung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungsblatt 3: Algorithmen in Java & Grammatiken

Grundlagen der Theoretischen Informatik, SoSe 2008

Erstellen von x-y-diagrammen in OpenOffice.calc

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Professionelle Seminare im Bereich MS-Office

Graphic Coding. Klausur. 9. Februar Kurs A

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 4 -

Computeranwendung und Programmierung (CuP)

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

BEISPIELKLAUSUR Softwareentwicklung:

Quadratische Gleichungen

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup Conrad Kobsch

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Viele Bilder auf der FA-Homepage

Klausur in Programmieren

Übersicht Programmablaufsteuerung

Primzahlen und RSA-Verschlüsselung

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Fallbeispiel: Eintragen einer Behandlung

Rekursionen. Georg Anegg 25. November Methoden und Techniken an Beispielen erklärt

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Wie ist das Wissen von Jugendlichen über Verhütungsmethoden?

FH-SY Chapter Version 3 - FH-SY.NET - FAQ -

VL06: Haskell (Funktionen höherer Ordnung, Currying)

Übungen zu C++ Kapitel 1

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

Transkript:

Funktionale Programmierung mit Haskell Dr. Michael Savorić Hohenstaufen-Gymnasium (HSG) Kaiserslautern Version 20120622

Überblick Wichtige Eigenschaften Einführungsbeispiele Listenerzeugung und Beispiel Funktionen höherer Ordnung und Beispiele (map, filter, foldr, foldl) Mergesort und Quicksort Tupel M. Savorić 2

Wichtige Eigenschaften von Haskell Es gibt keine globalen Variablen. Es gibt keine Schleifen. Ein Programm besteht aus Funktionen, die sich selbst (Rekursion) und / oder andere Funktionen aufrufen. Eine Funktion liefert bei gleichen Argumenten stets das gleiche Ergebnis (es gibt keine Seiteneffekte!). Die Datentypen Bool, Int, Integer, Float, Double, Char, String und Listen (z.b. [Integer]) sind vordefiniert, eigene Datentypen sind möglich. Kommentare bis zum Ende der Zeile werden mit -- eingeleitet. M. Savorić 3

Einführungsbeispiel 1: größter gemeinsamer Teiler (ggt) ggt :: Integer -> Integer -> Integer ggt a 0 = a ggt a b = ggt b (mod a b) Funktionsname Bemerkungen: Ergebnistyp 2. Parametertyp 1. Parametertyp Haskell geht den Quelltext von oben nach unten durch und wählt den ersten passenden Ausdruck (pattern matching) M. Savorić 4

Einführungsbeispiel 2: Länge einer Liste laenge :: [a] -> Integer laenge [] = 0 laenge (x:xs) = 1+(laenge xs) Bemerkungen: [a] ist eine Liste mit einem beliebigen Datentyp (a fungiert als Platzhalter für einen Datentyp) Listen werden in Haskell oftmals von vorne nach hinten durchlaufen, indem das erste Element einer Liste jeweils abgespalten und verarbeitet wird und anschließend die Restliste betrachtet wird M. Savorić 5

Einführungsbeispiel 3: Maximum einer Liste maxliste :: [Integer] -> Integer maxliste [x] = x maxliste (x:xs) x > max = x otherwise = max where max = maxliste xs Bemerkungen: Lokale Variablen können nach where definiert werden Verzweigungen können mit durchgeführt werden (guard) M. Savorić 6

Listenerzeugung ++ : [1,2]++[3,4] liefert [1,2,3,4] : : 1:[2,3,4] liefert [1,2,3,4] Aufzählung: [1..10] liefert [1,2,3,4,5,6,7,8,9,10] [1,3..10] liefert [1,3,5,7,9] Durch Angabe von Eigenschaften (List Comprehension): [x x <- [1..10], mod x 2 == 0] liefert [2,4,6,8,10] M. Savorić 7

Beispiel: Liste von Teilern einer Zahl Beispiel-Aufruf: teilerliste 24 liefert [1,2,3,4,6,8,12,24] teiler :: Integer -> Integer -> [Integer] teiler n m n < m = [] mod n m == 0 = [m] ++ (teiler n (m+1)) otherwise = teiler n (m+1) -- teilerliste :: Integer -> [Integer] teilerliste n = teiler n 1 M. Savorić 8

Funktionen höherer Ordnung Funktionen höherer Ordnung besitzen Funktionen als Argumente Beispiele: map: wandelt jedes Element einer Liste entsprechend einer Funktion um und speichert die jeweiligen Umwandlungsergebnisse in einer neuen Liste filter: filtert bestimmte Elemente einer Liste anhand einer speziellen Funktion (Rückgabewert Bool) und schreibt sie in eine neue Liste foldr / foldl: faltet eine Liste gemäß einer Funktion Bemerkung: map und filter und viele andere eingebaute Funktionen von Haskell sollten die Schüler im Rahmen von Übungen selbst programmieren. M. Savorić 9

map Definition: map :: (a -> b) -> [a] -> [b] Beispiel: map (\x -> x*x) [1..10] liefert [1,4,9,16,25,36,49,64,81,100] Bemerkungen: (\x -> x*x) ist eine Lambda-Definition für eine Funktion ohne Namen [1..10] erzeugt die Liste [1,2,3,4,5,6,7,8,9,10] M. Savorić 10

filter Definition: filter :: (a -> Bool) -> [a] -> [a] Beispiel: filter (\x -> mod 10 x == 0) [1..10] liefert [1,2,5,10] Bemerkungen: Für die filter-funktion sind auch Vergleiche möglich, z.b. liefert filter (<= 5) [1..10] die Liste [1,2,3,4,5] M. Savorić 11

Beispiel: Liste von Teilern einer Zahl (Version mit filter) teilerliste :: Integer -> [Integer] teilerliste n = filter (\x -> mod n x == 0) [1..n] -- prim :: Integer -> Bool prim n (length (teilerliste n)) == 2 = True otherwise = False M. Savorić 12

Faltungen Rechtsfaltung mit Startwert: foldr f s [x 1,..., x n ] = f x 1 (f x 2 (... (f x n s)...)) Ohne Startwert (foldr1) wird sofort mit dem Element x n als Startwert begonnen, d.h. (f x n-1 (f x n s)) wird ersetzt durch (f x n-1 x n ) Linksfaltung mit Startwert: foldl f s [x 1,..., x n ] = f (... (f (f s x 1 ) x 2 )...) x n Ohne Startwert (foldl1) wird sofort mit dem Element x 1 als Startwert begonnen, d.h. (f (f s x 1 ) x 2 ) wird ersetzt durch (f x 1 x 2 ) M. Savorić 13

Beispiele Summe einer Liste von Zahlen: summe :: [Integer] -> Integer summe [] = 0 summe xs = foldr (+) 0 xs Umdrehen einer Liste: umdrehen :: [Integer] -> [Integer] umdrehen [] = [] umdrehen xs = foldr (hinten_anfuegen) [] xs M. Savorić 14

Mergesort für ganze Zahlen merge :: [Integer] -> [Integer] -> [Integer] merge xs [] = xs merge [] ys = ys merge (x:xs) (y:ys) x <= y = [x] ++ (merge xs (y:ys)) x > y = [y] ++ (merge (x:xs) ys) -- mergesort :: [Integer] -> [Integer] mergesort [] = [] mergesort [x] = [x] mergesort xs = merge (mergesort (take mitte xs)) (mergesort (drop mitte xs)) where mitte = div (length xs) 2 M. Savorić 15

Quicksort für ganze Zahlen quicksort :: [Integer] -> [Integer] quicksort [] = [] quicksort [x] = [x] quicksort (x:xs) = (quicksort liste_li) ++ [x] ++ (quicksort liste_re) where liste_li = [k k <- xs, k <= x] liste_re = [k k <- xs, k > x] Problem: Die Liste xs wird zur Erzeugung der Teillisten zweimal durchlaufen. M. Savorić 16

Tupel Mehrere Werte (eventuell mit unterschiedlichen Typen) werden zu einem Tupel zusammengefasst, um so z.b. bei einer Funktion indirekt mehr als einen Wert zurückliefern zu können. Beispiel (für die verbesserte Quicksort-Version): listenaufteilung :: Integer -> [Integer] -> ([Integer],[Integer]) listenaufteilung pivot [] = ([],[]) listenaufteilung pivot (x:xs) x <= pivot = ([x] ++ (fst lt), snd lt) otherwise = (fst lt, [x] ++ (snd lt)) where lt = listenaufteilung pivot xs M. Savorić 17

Quicksort für ganze Zahlen (verbesserte Version) quicksort :: [Integer] -> [Integer] quicksort [] = [] quicksort [x] = [x] quicksort (x:xs) = (quicksort liste_li) ++ [x] ++ (quicksort liste_re) where liste_li = fst listentupel liste_re = snd listentupel listentupel = listenaufteilung x xs Bemerkungen: fst bzw. snd liefern den ersten bzw. zweiten Wert eines Tupels M. Savorić 18

Beispiele: KA-Aufgaben, komplexere Aufgaben Schreibe in Haskell eine Funktion menge, die aus einer Liste von Zahlen eine Menge von Zahlen erzeugt und zurückliefert. Hinweis: In einer Menge von Zahlen kommen keine Zahlen mehrfach vor. Als nichttriviale Teiler bezeichnet man die Menge aller Teiler einer natürlichen Zahl ohne die Zahl selbst. Ein Beispiel: Die Zahl 12 hat die nichttrivialen Teiler 1, 2, 3, 4 und 6. Eine natürliche Zahl heißt vollkommen, wenn die Summe ihrer nichttrivialen Teiler gleich der Zahl ist. Schreibe eine Funktion vollkommen_liste in Haskell, die alle vollkommenen Zahlen zwischen 1 und 1000 berechnet und in Form einer Liste zurückliefert. MIRP-Zahlen sind Primzahlen, die auch rückwärts gelesen eine Primzahl ergeben. Bestimme alle MIRP-Zahlen zwischen 1 und 1000. M. Savorić 19

Literatur Block, M., Neumann, A., Haskell Intensivkurs, Springer, 2011, ISBN 978-3-642-04717-6. Hutton, G., Programming in Haskell, Cambridge University Press, 2008, ISBN978-0-521-69269-4. M. Savorić 20