Workshop Einführung in die Sprache Haskell

Ähnliche Dokumente
Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Funktionale Programmierung

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

5. Tutorium zu Programmieren

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

Java Kurs für Anfänger Einheit 5 Methoden

Funktionale Programmierung

Grundprinzipien der funktionalen Programmierung

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

Haskell. A Wild Ride. Sven M. Hallberg. sm@khjk.org. 21C3 Berlin / Bildungswerk Hamburg p. 1/36

Formale Spezialisierungstechniken. am Beispiel des binären Baums. Hybride Programmiersprachen Daniel Krompass Berlin, 2009

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Funktionale Programmierung mit Haskell

Verträge für die funktionale Programmierung Design und Implementierung

Repetitorium Informatik (Java)

Haskell zur Constraint-Programmierung HaL8

Funktionale Programmierung mit Haskell. Jan Hermanns

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Grundlagen der Programmierung 2. Bäume

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

Generische Record-Kombinatoren mit statischer Typprüfung

KryptoCore-Entwurf und Funktionale Programmierung

Heutiges Thema... Datenstrukturen in Haskell... Algebraische Datentypen (data Tree =...) Typsynonyme (type Student =...)

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

Objektorientierte Programmierung

Funktionale Programmierung. der direkte Weg vom Modell zum Programm

Fakultät Wirtschaftswissenschaft

SWP Prüfungsvorbereitung

Funktionale Programmierung mit C++

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

CGI Programmierung mit Ha. Markus Schwarz

Kapitel 7 des Buches, von Java-Selbstbau nach Scala-Library portiert Christoph Knabe

Ausarbeitung des Interpreter Referats

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Eine zu Grunde liegende Typdefinition beschreibt eine Struktur, die alle erlaubten Instanzen dieses Typs gemeinsam haben.

Objektorientierte Programmierung

Kapitel 7: Benutzerdefinierte Datentypen

XML Verarbeitung mit einer in Haskell eingebetteten DSL. Manuel Ohlendorf (xi2079)

Einführung in die Informatik 1

Algorithmen und Datenstrukturen

1. Teilklausur. Modul "OOPM Vorlesung/Übung" Gruppe A

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

1 Polymorphie (Vielgestaltigkeit)

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Fachschaftsratssitzung

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

EndTermTest PROGALGO WS1516 A

Programmierung in Python

Programmierkurs Java

VBA-Programmierung: Zusammenfassung

Proseminar Funktionales Programmieren. Stephan Kreutzer

Programmierung und Modellierung

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

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

Datenstrukturen & Algorithmen

5.4 Klassen und Objekte

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

E-PRIME TUTORIUM Die Programmiersprache BASIC

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

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Probeklausur: Programmierung WS04/05

Spezifikation der zulässigen Parameter. Bemerkungen: Bemerkungen: (2) Design by Contract:

Klassendefinitionen verstehen

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Einführung in die Java- Programmierung

Funktionales Programmieren

SOMA Reverse Engineering

Schnittstellen implementieren am Beispiel Suchbaum

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Einführung in die Java- Programmierung

Vererbung & Schnittstellen in C#

Java Generics & Collections

Scala kann auch faul sein

Eine Einführung in die funktionale Programmierung mit Haskell

Java Schulung (Java 2 Java Development Kit 5 / 6)

Aufgabenstellung und Zielsetzung

1. Grundlegende Konzepte in Java (6 Punkte)

Praktikum Funktionale Programmierung Teil 1: Lexen und Parsen

Funktionale Programmierung. Frank Adler

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

Klassenbeziehungen & Vererbung

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Java lernen mit BlueJ

Einführung in die Programmierung

5.5.8 Öffentliche und private Eigenschaften

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

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio /9

Excel Funktionen durch eigene Funktionen erweitern.

Elemente der Softwareentwicklung

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 : [ ]))?

Programmentwicklung I für Hörer anderer Fachrichtungen -Wintersemester 2003/04- Abschlussklausur

Felder. November 5, 2014

Alexander Niemann. Das Einsteigerseminar Objektorientierte Programmierung in Java. bhv

Selbstbestimmtes Lernen. Proinformatik III Objektorientierte Programmierung. Format. Inhalt. Buzzwords

Kapiteltests zum Leitprogramm Binäre Suchbäume

Transkript:

Workshop Einführung in die Sprache Haskell Nils Rexin, Marcellus Siegburg und Alexander Bau Fakultät für Informatik, Mathematik und Naturwissenschaften Hochschule für Technik, Wirtschaft und Kultur Leipzig 07. Oktober 2011 N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 1 / 27

Übersicht Übersicht 1 Haskell 2 Programmieren mit Haskell 3 Rekursionsmuster N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 2 / 27

Allgemeines zu Haskell Haskell Eigenschaften referentielle Transparenz (keine Nebenwirkung) Bedarfsauswertung (Lazy Evaluation) Funktionen höherer Ordnung Entwurfsmusterunterstützung kurzer Weg zwischen Spezifikation und Implementation... N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 3 / 27

Datentyp Programmieren mit Haskell eigener Datentyp Boolean data Boolean = Wahr F a l s c h d e r i v i n g Show Boolean ist der Typ Wahr, Falsch sind Konstruktoren ist das Trennzeichen zwischen Konstruktoren deriving Show Vererbung.toString() in Java Einrückung beachten (Leerzeichen, Tabulatur) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 4 / 27

Pattern Matching Programmieren mit Haskell eigener Datentyp Boolean data Boolean = Wahr F a l s c h d e r i v i n g Show UND - Funktion und x y = case x of F a l s c h F a l s c h Wahr case y o f Wahr Wahr F a l s c h F a l s c h ODER - Funktion oder x y = undefined N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 5 / 27

Pattern Matching verschiedene Möglichkeiten Programmieren mit Haskell UND - Funktion und x y = case x of F a l s c h F a l s c h Wahr case y o f Wahr Wahr F a l s c h F a l s c h... mit if-then-else und x y = i f x == F a l s c h then F a l s c h e l s e i f y == Wahr then Wahr e l s e F a l s c h... ohne spezielle Einrückung und x y = case x of { F a l s c h F a l s c h ; Wahr undefined } N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 6 / 27

Pattern Matching verschiedene Möglichkeiten Programmieren mit Haskell UND - Funktion und x y = case x of F a l s c h F a l s c h Wahr case y o f Wahr Wahr F a l s c h F a l s c h... mit if-then-else und x y = i f x == F a l s c h then F a l s c h e l s e i f y == Wahr then Wahr e l s e F a l s c h... ohne spezielle Einrückung und x y = case x of { F a l s c h F a l s c h ; Wahr undefined } N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 6 / 27

Pattern Matching verschiedene Möglichkeiten Programmieren mit Haskell UND - Funktion und x y = case x of F a l s c h F a l s c h Wahr case y o f Wahr Wahr F a l s c h F a l s c h... mit if-then-else und x y = i f x == F a l s c h then F a l s c h e l s e i f y == Wahr then Wahr e l s e F a l s c h... ohne spezielle Einrückung und x y = case x of { F a l s c h F a l s c h ; Wahr undefined } N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 6 / 27

Pattern Matching mit un-/konkreten Konstruktoren Programmieren mit Haskell UND - Funktion und Wahr Wahr = Wahr und = F a l s c h ODER - Funktion oder F a l s c h F a l s c h = F a l s c h oder = Wahr N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 7 / 27

Pattern Matching mit konkreten Konstruktoren Programmieren mit Haskell Datentyp mit zwei ploymorphen Elementen; positionelle Notation data Paar a = Paar a a swap ( Paar x y ) = Paar y x Datentyp mit zwei ploymorphen Elementen; benannte Notation data Paar a = Paar {x : : a, y : : a} swap p = Paar ( y p ) ( x p ) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 8 / 27

Pattern Matching mit konkreten Konstruktoren Programmieren mit Haskell Datentyp mit zwei ploymorphen Elementen; positionelle Notation data Paar a = Paar a a swap ( Paar x y ) = Paar y x Datentyp mit zwei ploymorphen Elementen; benannte Notation data Paar a = Paar {x : : a, y : : a} swap p = Paar ( y p ) ( x p ) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 8 / 27

Programmieren mit Haskell Pattern Matching mit konkreten Konstruktoren und case-of-ausdruck case-of-ausdruck mit beliebigen Datentyp data D = Foo {a : : Int, b : : I n t } Bar { c : : I n t } d e r i v i n g Show f x = case x of Foo {a = x, b = y} x + y Bar {} c x Allgemein ist zubehalten Zu jedem Konstruktor eines Datentyps gibt es einen Zweig im case-of-ausdruck. N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 9 / 27

Rekursiver Datentyp Programmieren mit Haskell Datentyp für polymorphe Listen definieren data L i s t e a = N i l Cons a ( L i s t e a ) d e r i v i n g Show Funktionen auf Liste a key ( Cons x xs ) = x next ( Cons x xs ) = xs N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 10 / 27

Rekursiver Datentyp Programmieren mit Haskell Datentyp Liste mit benannten Komponenten data L i s t e a = N i l Cons { key : : a, next : : L i s t e a} d e r i v i n g Show N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 11 / 27

Programmieren mit Haskell Anwendung Aufgabe Datenstruktur die eine Linie, ein Rechteck und ein Kreis zusammenfasst Jedes Element soll eine Position enthalten (ganzzahlig) (Paar Int) Funktion, die den Flächeninhalt der oben genannten Objekte berechnet N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 12 / 27

Typen Programmieren mit Haskell Typdefinitionen bei Funktionen explizit möglich Typdefinition n i c h t : : Boolean Boolean n i c h t a = case a of Wahr F a l s c h F a l s c h Wahr Haskell kann den Typ inferieren (ableiten) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 13 / 27

Rekursive Funktionen Aufgaben Programmieren mit Haskell Können bei rekursiven Datenstrukturen verwendet werden Auswertung einer Boolean-Liste u n d L i s t e : : L i s t e Boolean Boolean u n d L i s t e l i s t e = case l i s t e of N i l Wahr Cons a as und a ( u n d L i s t e as ) Listenverknüpfung v e r b i n d e n : : L i s t e a L i s t e a L i s t e a v e r b i n d e n a b = case a of N i l b Cons a as Cons a ( v e r b i n d e n as b ) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 14 / 27

Rekursive Funktionen Programmieren mit Haskell Funktion, die eine Liste umkehrt Typ der Umpkehrfunktion umkehren : : L i s t e a L i s t e a Ein Paar von zwei Listen gleicher Länge, gleichen Typs in einer Paar-Liste zusammenführen Aus einer Paar Liste ein Paar mit zwei neuen Listen erzeugen N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 15 / 27

Programmieren mit Haskell Map Anonyme Funktionen Funktion wird nicht benannt Verwendung eines Lambda-Ausdrucks Beispiel addanonym : : Boolean Boolean Boolean addanonym = ( λ a b case a o f Wahr b F a l s c h F a l s c h ) addanonym2 = ( λ a ( λ b case a o f Wahr b F a l s c h F a l s c h ) ) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 16 / 27

Programmieren mit Haskell Map Funktionen höherer Ordnung Funktion als Rückgabewert Funktion als Parameter Beispiel o p e r a t i o n P a a r : : ( a a b ) Paar a b o p e r a t i o n P a a r f ( Paar a b ) = f a b undpaar : : Paar Boolean Boolean undpaar p = o p e r a t i o n P a a r (λ a b und a b ) p N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 17 / 27

Programmieren mit Haskell Map Definition Idee: Auf alle Elemente einer rekursiven Struktur die selbe Funktion anwenden Definition von Map: Map für Listen mapliste : : ( a b ) L i s t e a L i s t e b mapliste f l = case l of N i l N i l Cons a as Cons ( f a ) ( mapliste f as ) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 18 / 27

Programmieren mit Haskell Map Aufgaben und auf alle Boolean-Paare in einer Liste anwenden Aus einer Liste mit geometrischen Objekten alle Quadrate durch Wahr in einer neu erzeugten Boolean-Liste hervorheben N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 19 / 27

Motivation Rekursionsmuster Rekursive Funktionen auf Listen summe l i s t e = case l i s t e of N i l 0 Cons x x s x + summe x s l a e n g e l i s t e = case l i s t e of N i l 0 Cons xs 1 + l a e n g e xs u n d L i s t e l i s t e = case l i s t e of N i l Wahr Cons x xs und x ( u n d L i s t e xs ) gemeinsames Muster? N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 20 / 27

Fold auf Listen (1) Rekursionsmuster Muster (Pseudocode) f l i s t e = case l i s t e of N i l? exp1? Cons x xs? exp2? x ( f xs ) Abstraktion des gemeinsamen Musters f o l d L i s t e : : b ( a b b ) L i s t e a b f o l d L i s t e exp1 exp2 l i s t e = case l i s t e of N i l exp1 Cons x xs exp2 x ( f o l d L i s t e exp1 exp2 xs ) N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 21 / 27

Fold auf Listen (2) Rekursionsmuster Rekursive Funktionen auf Listen summe l i s t e = case l i s t e o f N i l 0 Cons x xs x + summe x s l a e n g e l i s t e = case l i s t e o f N i l 0 Cons x s 1 + l a e n g e x s u n d L i s t e l i s t e = case l i s t e o f N i l Wahr Cons x xs und x ( u n d L i s t e x s ) Definition mit Fold summe l i s t e = f o l d L i s t e 0 (λx r e s u l t x + r e s u l t ) l i s t e l a e n g e l i s t e = f o l d L i s t e 0 (λx r e s u l t 1 + r e s u l t ) l i s t e u n d L i s t e l i s t e = f o l d L i s t e Wahr (λx r e s u l t und x r e s u l t ) l i s t e N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 22 / 27

Fold auf Listen (3) Rekursionsmuster Übung: Ersetze undefined v e r b i n d e n : : L i s t e a L i s t e a L i s t e a v e r b i n d e n a b = f o l d L i s t e undefined undefined a umkehren : : L i s t e a L i s t e a L i s t e a umkehren l i s t e = f o l d L i s t e undefined undefined l i s t e N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 23 / 27

Fold im Allgemeinen Rekursionsmuster für jeden Konstruktor K eines Types bekommt fold ein Parameter p p hat die gleiche Stelligkeit wie K Parametertypen von K entsprechen den Parametertypen von p (fast, s. Rekursion) Vergleiche Liste a mit foldliste data L i s t e a = N i l Cons a ( L i s t e a ) f o l d L i s t e : : b ( a b b ) L i s t e a b N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 24 / 27

Fold auf Bäumen Rekursionsmuster Übung: Ersetze? und undefined data Baum a = B l a t t Zweig (Baum a ) a (Baum a ) foldbaum : :?? Baum a b foldbaum b l a t t zweig baum = undefined summeschluessel : : Baum I n t e g e r I n t e g e r summeschluessel baum = foldbaum undefined undefined baum hoehe : : Baum a I n t e g e r hoehe baum = foldbaum undefined undefined baum i n o r d e r S c h l u e s s e l : : Baum a L i s t e a i n o r d e r S c h l u e s s e l baum = foldbaum undefined undefined baum N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 25 / 27

Zusammenfassung Zusammenfassung Aufgabe mit Pattern Matching (case-of) rekursive (Liste, Baum) Polymorphie Typ-Definition Funktionen höherer Ordnung (mapliste) Lambda-Ausdruck Besuchermuster (fold) auf Listen, Bäumen N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 26 / 27

Zusammenfassung Zusammenfassung Ausblick jetzt: Kaffeepause (Cafeteria) Tutorium: Deterministische Parallele Programmierung in Haskell nachmittags: Vorträge und Diskussionen unterstützt vom FSR IMN N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 26 / 27

Vielen Dank für Ihre Aufmerksamkeit N. Rexin, M. Siegburg, A. Bau Haskell-Einführung 07. Oktober 2011 27 / 27