Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

Ähnliche Dokumente
Crashkurs: Haskell. Mentoring FU Berlin Felix Droop

ALP I. Funktionale Programmierung

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 4A

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 4A

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

ALP I Einführung in Haskell

Einführung in Haskell und seine Werkzeuge

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Programmieren in Haskell

Basiskonstrukte von Haskell

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler)

Vorsemesterkurs Informatik

Einführung in die funktionale Programmierung

Funktionale Programmierung mit Haskell

WS 2011/2012. Georg Sauthoff 1. November 11, 2011

Haskell. (Compiler) Prof. Dr. Oliver Braun. Letzte Änderung: :58. Haskell 1/28

Grundlegende Datentypen

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

Grundlegende Datentypen

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

Funktionale Programmierung Grundlegende Datentypen

ProInformatik: Funktionale Programmierung. Punkte

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Programmieren in Haskell Einführung

Vorsicht bei redundanten und unvollständigen Matches!

Funktionale Programmierung Mehr funktionale Muster

Musterlösung zur 2. Aufgabe der 4. Übung

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

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmierkurs II. Typsynonyme & algebraische Datentypen

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Informatik I - Programmierung Globalübung Hugs98 Currying. Hugs98 Currying

Paradigmen der Programmierung

Programmieren in Haskell

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Einstieg in die Informatik mit Java

Grundlagen der Programmierung 2 (1.A)

Programmierparadigmen

Programmieren in Haskell

Einführung in Haskell

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Inhalt Kapitel 2: Rekursion

Primitive Datentypen in Haskell

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung

WS 2011/2012. Robert Giegerich. October 17, 2012

Projekt 3 Variablen und Operatoren

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Funktionale Programmierung

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

Grundlagen der Programmierung 2 A (Listen)

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

EINFÜHRUNG IN DIE PROGRAMMIERUNG

WS 2011/2012. RobertGiegerich. November 12, 2013

WS 2011/2012. RobertGiegerich. November 12, 2013

Tag 6. Module, benannte Funktionen und Rekursion

Übungsblatt 1. Java Vorkurs (WS 2017)

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

Grundlagen der Programmierung 2 (2.A)

Programmieren in Haskell Einstieg in Haskell

Tag 7. Pattern Matching und eigene Datentypen

Die Korrektheit von Mergesort

Übungszettel 2a - Python

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Einführung in die Programmierung

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

Java Übung. Übung 2. Werner Gaulke. 19. April Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Einführung in die Funktionale Programmierung mit Haskell

ALP I. Funktionale Programmierung

Vorsemesterkurs Informatik

Programmieren in Haskell Programmiermethodik

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

WS 2011/2012. Georg Sauthoff 1. October 18, 2011

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Grundlagen der Programmierung 2 (1.A)

Übungen zur Vorlesung Wissenschaftliches Rechnen I

Funktionale Programmierung ALP I. Die Natur rekursiver Funktionen SS Prof. Dr. Margarita Esponda. Prof. Dr.

Martin Unold INFORMATIK. Geoinformatik und Vermessung

C.3 Funktionen und Prozeduren

Typ-Polymorphismus. November 12, 2014

Datentypen: integer, char, string, boolean

Repetitorium Programmieren I + II

Elementare Datentypen in C++

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

HASKELL KAPITEL 5. Rekursion

Programmierung und Modellierung mit Haskell

Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom : Funktionen und Datentypen

Aufruf des Compilers in der Kommandozeile und Ausführung des Programms:

Vorsemesterkurs Informatik

Parallele und funktionale Prog. Wintersemester 2011/ Übung Abgabe bis , 10:00 Uhr

Algorithmen und Datenstrukturen 02

Algorithmen & Programmierung. Rekursive Funktionen (2)

Einführung in C. EDV1-04C-Einführung 1

Programmieren 1 C Überblick

Java: Eine kurze Einführung an Beispielen

Transkript:

Crashkurs Haskell Mentoring WiSe 2016/17 Anja Wolffgramm Freie Universität Berlin 02/11/2016

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 2

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 3

Kommandozeile Linux/Mac[1] Windows[2] Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 4

Kommandozeile Linux/Mac[1] 1. Kommandozeile starten nach Terminal suchen Windows[2] nach cmd suchen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 4

Kommandozeile Linux/Mac[1] 1. Kommandozeile starten nach Terminal suchen 2. Ordnerinhalt anzeigen lassen Windows[2] nach cmd suchen ls dir Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 4

, Kommandozeile Linux/Mac[1] 1. Kommandozeile starten nach Terminal suchen 2. Ordnerinhalt anzeigen lassen Windows[2] nach cmd suchen ls dir 3. In ein Verzeichnis wechseln cd mein/pfad cd mein\pfad 4. In das übergeordnete Verzeichnis wechseln cd.. cd.. Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 4

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 5

Haskell installieren & starten Die Seite https://www.haskell.org/platform/windows.html aufrufen und das Betriebssystem auswählen: Linux/Mac Windows 1. Distribution bzw. Paket-Manager auswählen 2. Full-Haskell-Paket herunterladen und ausführen oder Befehl in Kommandozeile eingeben 3. Befehl in Kommandozeile eingeben: ghci 1. Full-Haskell-Paket (32 oder 64 Bit) herunterladen 2. den Installer als Admin ausführen (rechte Maustaste, als Administrator ausführen und bestätigen) 3. Die Cabal Konfigurationsdatei modifizieren (Anweisungen auf der Webseite) 4. unter Programme oder Alle Apps WinGHCi ausführen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 6

, Haskell installieren & starten Die Seite https://www.haskell.org/platform/windows.html aufrufen und das Betriebssystem auswählen: Linux/Mac Windows Und so sieht es dann aus: 1. Distribution bzw. Paket-Manager auswählen 2. Full-Haskell-Paket herunterladen und ausführen oder Befehl in Kommandozeile eingeben 3. Befehl in Kommandozeile eingeben: ghci 1. Full-Haskell-Paket (32 oder 64 Bit) herunterladen 2. den Installer als Admin ausführen (rechte Maustaste, als Administrator ausführen und bestätigen) 3. Die Cabal Konfigurationsdatei modifizieren (Anweisungen auf der Webseite) 4. unter Programme oder Alle Apps WinGHCi ausführen GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help Prelude> Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 6

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 7

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) 2. Folgende Zeilen schreiben 1 meinefunktion :: [Char] 2 meinefunktion = "Hello World!" Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) 2. Folgende Zeilen schreiben 1 meinefunktion :: [Char] 2 meinefunktion = "Hello World!" 3. Datei als «meinprogramm.hs» speichern Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) 2. Folgende Zeilen schreiben 1 meinefunktion :: [Char] 2 meinefunktion = "Hello World!" 3. Datei als «meinprogramm.hs» speichern Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) 2. Folgende Zeilen schreiben 1 meinefunktion :: [Char] 2 meinefunktion = "Hello World!" 3. Datei als «meinprogramm.hs» speichern 4. Zur Kommandozeile wechseln und das Programm laden :load meinprogramm.hs Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) 2. Folgende Zeilen schreiben 1 meinefunktion :: [Char] 2 meinefunktion = "Hello World!" 3. Datei als «meinprogramm.hs» speichern 4. Zur Kommandozeile wechseln und das Programm laden :load meinprogramm.hs 5. Funktion aufrufen meinefunktion Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Einen Texteditor öffnen (z. B. Notepad++, Kate, Gedit) 2. Folgende Zeilen schreiben 1 meinefunktion :: [Char] 2 meinefunktion = "Hello World!" 3. Datei als «meinprogramm.hs» speichern 4. Zur Kommandozeile wechseln und das Programm laden :load meinprogramm.hs 5. Funktion aufrufen meinefunktion Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 8

Ein 1. Haskell-Programm 1. Änderung im Programm meinefunktion :: Int > Int meinefunktion n = 2 n Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 9

Ein 1. Haskell-Programm 1. Änderung im Programm meinefunktion :: Int > Int meinefunktion n = 2 n 2. Programm neu laden :reload Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 9

Ein 1. Haskell-Programm 1. Änderung im Programm meinefunktion :: Int > Int meinefunktion n = 2 n 2. Programm neu laden :reload 3. Interpreter beenden :quit Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 9,

, Ein 1. Haskell-Programm 1. Änderung im Programm meinefunktion :: Int > Int meinefunktion n = 2 n 2. Programm neu laden :reload 3. Interpreter beenden :quit Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 9

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 10

Funktionsdefinition Die Funktionsdefinition umfasst sowohl die Signatur (Funktionskopf), als auch den Funktionsrumpf. Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 11

Funktionsdefinition Die Funktionsdefinition umfasst sowohl die Signatur (Funktionskopf), als auch den Funktionsrumpf. Die Signatur enthält den Funktionsnamen, den Definitions- und Wertebereich. Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 11

Funktionsdefinition Die Funktionsdefinition umfasst sowohl die Signatur (Funktionskopf), als auch den Funktionsrumpf. Die Signatur enthält den Funktionsnamen, den Definitions- und Wertebereich. Die Funktion f (x) = x 2 hat den Definitionsbereich R und bildet auf alle Zahlen 0 ab. In der Mathematik schreibt man: f : R R Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 11

Funktionsdefinition Die Funktionsdefinition umfasst sowohl die Signatur (Funktionskopf), als auch den Funktionsrumpf. Die Signatur enthält den Funktionsnamen, den Definitions- und Wertebereich. Die Funktion f (x) = x 2 hat den Definitionsbereich R und bildet auf alle Zahlen 0 ab. In der Mathematik schreibt man: f : R R In Haskell ist das ähnlich: 1 f :: Double > Double -- Signatur / Funktions-Deklaration 2 f x = x x -- Funktionsrumpf Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 11

, Funktionsdefinition Die Funktionsdefinition umfasst sowohl die Signatur (Funktionskopf), als auch den Funktionsrumpf. Die Signatur enthält den Funktionsnamen, den Definitions- und Wertebereich. Die Funktion f (x) = x 2 hat den Definitionsbereich R und bildet auf alle Zahlen 0 ab. In der Mathematik schreibt man: f : R R In Haskell ist das ähnlich: 1 f :: Double > Double -- Signatur / Funktions-Deklaration 2 f x = x x -- Funktionsrumpf Der Funktionsrumpf gibt die konkrete Abbildung vom Definitions- zum Wertebereich an. Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 11

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 12

, Primitive Datentypen Name Wertebereich Bool {True, False} Int { 2 31,..., 2 31 1} Integer N Float [ 2 38, 2 38 ], 8 Nachkommastellen Double [ 2 308, 2 308 ], 16 Nachkommastellen Char ASCII-Zeichen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 13

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 14

, Vergleiche & Operationen Vergleiche ==, /=, <, >, >=, <=, compare Datentyp Operationen Bool not, &&, Int, Integer +, -, *, ˆ, div, mod, odd,... Float, Double +, -, *, /, **, floor, ceil, sin, sqrt,... Char fromenum allgemein max, min, pred, succ Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 15

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 16

Parameterübergabe Als currifizierte Funktion beschreibt man diejenigen, welche ihre Parameter einzeln bekommen: Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 17

Parameterübergabe Als currifizierte Funktion beschreibt man diejenigen, welche ihre Parameter einzeln bekommen: 1 volumen :: Double > Double > Double > Double 2 volumen a b c = a b c Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 17

Parameterübergabe Als currifizierte Funktion beschreibt man diejenigen, welche ihre Parameter einzeln bekommen: 1 volumen :: Double > Double > Double > Double 2 volumen a b c = a b c Eine uncurrifizierte Funktion erhält ein Parameter-Tupel: Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 17

Parameterübergabe Als currifizierte Funktion beschreibt man diejenigen, welche ihre Parameter einzeln bekommen: 1 volumen :: Double > Double > Double > Double 2 volumen a b c = a b c Eine uncurrifizierte Funktion erhält ein Parameter-Tupel: 3 volumen :: (Double > Double > Double) > Double 4 volumen (a,b,c) = a b c Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 17

, Parameterübergabe Als currifizierte Funktion beschreibt man diejenigen, welche ihre Parameter einzeln bekommen: 1 volumen :: Double > Double > Double > Double 2 volumen a b c = a b c Eine uncurrifizierte Funktion erhält ein Parameter-Tupel: 3 volumen :: (Double > Double > Double) > Double 4 volumen (a,b,c) = a b c Aufgabe: Schreibt eine Funktion, die entscheidet, ob eine Zahl ganzzahlig durch 2 oder durch 3, nicht aber durch 6 teilbar ist. Beispiel: test 15 = True test 12 = False Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 17

, Pause Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 18

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 19

, Typsynonyme Um sich Schreibarbeit zu ersparen, kann man eigene Datentypen entwerfen, die sich aus primitiven Datentypen zusammensetzen. 1 type Punkt = (Double, Double) 2 type Strecke = (Punkt, Punkt) 3 type Dreieck = (Punkt, Punkt, Punkt) 5 umfang :: Dreieck > Double 6 umfang (p1,p2,p3) = distance p1 p2 + distance p2 p3 + distance p3 p1 7 where 8 distance :: Punkt > Punkt > Double 9 distance (x1,y1) (x2,y2) = -- siehe Übungsblatt 2 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 20

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 21

Fallunterscheidung Wir wollen eine Funktion bauen, die zwei Binärziffern addiert. Dabei müssen wir für die Eingabeparameter a,b mehrere Fälle unterscheiden. if-then-else 1 binaryadd1 :: Int > Int > Int 2 binaryadd1 a b = if a == 0 3 then b 4 else if b == 0 5 then a 6 else 0 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 22

Fallunterscheidung Wir wollen eine Funktion bauen, die zwei Binärziffern addiert. Dabei müssen wir für die Eingabeparameter a,b mehrere Fälle unterscheiden. if-then-else 1 binaryadd1 :: Int > Int > Int 2 binaryadd1 a b = if a == 0 3 then b 4 else if b == 0 5 then a 6 else 0 Guards 7 binaryadd2 :: Int > Int > Int 8 binaryadd2 a b 9 a == 0 = b 10 b == 0 = a 11 otherwise = 0 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 22

Fallunterscheidung Wir wollen eine Funktion bauen, die zwei Binärziffern addiert. Dabei müssen wir für die Eingabeparameter a,b mehrere Fälle unterscheiden. if-then-else 1 binaryadd1 :: Int > Int > Int 2 binaryadd1 a b = if a == 0 3 then b 4 else if b == 0 5 then a 6 else 0 Guards 7 binaryadd2 :: Int > Int > Int 8 binaryadd2 a b 9 a == 0 = b 10 b == 0 = a 11 otherwise = 0 Pattern-Matching 12 binaryadd3 :: Int > Int > Int 13 binaryadd3 0 0 = 0 14 binaryadd3 1 1 = 0 15 binaryadd3 a b = 1 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 22

Fallunterscheidung Wir wollen eine Funktion bauen, die zwei Binärziffern addiert. Dabei müssen wir für die Eingabeparameter a,b mehrere Fälle unterscheiden. if-then-else 1 binaryadd1 :: Int > Int > Int 2 binaryadd1 a b = if a == 0 3 then b 4 else if b == 0 5 then a 6 else 0 Guards 7 binaryadd2 :: Int > Int > Int 8 binaryadd2 a b 9 a == 0 = b 10 b == 0 = a 11 otherwise = 0 Pattern-Matching 12 binaryadd3 :: Int > Int > Int 13 binaryadd3 0 0 = 0 14 binaryadd3 1 1 = 0 15 binaryadd3 a b = 1 case-of 16 binaryadd4 :: Int > Int > Int 17 binaryadd4 a b = case (a,b) of 18 (0,0) > 0 19 (1,1) > 0 20 _ > 1 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 22

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 23

Rekursion Rekursion (Bedeutung: auf sich rückbezüglich) besteht aus zwei Teilen: 1. Rekursionsanker 2. Rekursionsschritt (Funktion ruft sich selbst auf) Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 24

Rekursion Rekursion (Bedeutung: auf sich rückbezüglich) besteht aus zwei Teilen: 1. Rekursionsanker 2. Rekursionsschritt (Funktion ruft sich selbst auf) Folgendes Programm addiert alle geraden Zahlen von 2,..., n 1 addeven :: Int > Int 2 addeven 0 = 0 3 addeven n 4 n < 0 = error "negative Eingabe" 5 mod n 2 == 0 = n + (addeven (n 2)) 6 otherwise = addeven (n 1) Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 24

Rekursion Rekursion (Bedeutung: auf sich rückbezüglich) besteht aus zwei Teilen: 1. Rekursionsanker 2. Rekursionsschritt (Funktion ruft sich selbst auf) Folgendes Programm addiert alle geraden Zahlen von 2,..., n 1 addeven :: Int > Int 2 addeven 0 = 0 3 addeven n 4 n < 0 = error "negative Eingabe" 5 mod n 2 == 0 = n + (addeven (n 2)) 6 otherwise = addeven (n 1) Reduktion: addeven 5 addeven 4 4 + (addeven 2) 4 + (2+ (addeven 0)) 4+(2+0) 6 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 24

Rekursion Rekursion (Bedeutung: auf sich rückbezüglich) besteht aus zwei Teilen: 1. Rekursionsanker 2. Rekursionsschritt (Funktion ruft sich selbst auf) Folgendes Programm addiert alle geraden Zahlen von 2,..., n 1 addeven :: Int > Int 2 addeven 0 = 0 3 addeven n 4 n < 0 = error "negative Eingabe" 5 mod n 2 == 0 = n + (addeven (n 2)) 6 otherwise = addeven (n 1) Reduktion: addeven 5 addeven 4 4 + (addeven 2) 4 + (2+ (addeven 0)) 4+(2+0) 6 Die Funktion addeven ist linear-rekursiv, da sie sich in jedem Rekursionsschritt einmal aufruft. Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 24

Rekursion Ein Beispiel für eine nicht-lineare Rekursion ist die Fibonacci-Folge: 1 fib :: Int > Int 2 fib 0 = 1 3 fib 1 = 1 4 fib n = fib (n 1) + fib (n 2) -- hier gibt es zwei Rekursionsaufrufe Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 25

, Rekursion Ein Beispiel für eine nicht-lineare Rekursion ist die Fibonacci-Folge: 1 fib :: Int > Int 2 fib 0 = 1 3 fib 1 = 1 4 fib n = fib (n 1) + fib (n 2) -- hier gibt es zwei Rekursionsaufrufe Aufgabe: Schreibt eine linear-rekursive Funktion, welche die Quadratsumme aller geraden Zahlen von 2, 4,..., n berechnet. Beispiel: quadsum 5 = (2 2 + 4 2 ) = 20 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 25

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 26

, Listen Listen sind eine Folge von Elementen des gleichen Datentyps und können beliebig viele Elemente enthalten. Form Beschreibung Beispiele [] leere Liste [] [x] genau ein Element [1], [ a ], [True] [x,y] genau zwei Elemente [0,1] xs beliebige Liste [], [1,2], [1..] (x:xs) mindestens ein Element [False] (x1:x2:xs) mindestens zwei Elemente [1,2,3] Wobei die Darstellungen [1,2,3], (1:2:3:[]) äquivalent sind. Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 27

Listen Folgende Funktion addiert alle Zahlen einer Liste: 1 addall :: [Int] > Int 2 addall [] = 0 3 addall (x:xs) = x + (addall xs) Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 28

Listen Folgende Funktion addiert alle Zahlen einer Liste: 1 addall :: [Int] > Int 2 addall [] = 0 3 addall (x:xs) = x + (addall xs) Reduktion: addall [1,2] 1 + (addall [2]) 1 + (2 + addall []) 1 + (2 + 0) 3 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 28

Listen Folgende Funktion addiert alle Zahlen einer Liste: 1 addall :: [Int] > Int 2 addall [] = 0 3 addall (x:xs) = x + (addall xs) Reduktion: addall [1,2] 1 + (addall [2]) 1 + (2 + addall []) 1 + (2 + 0) 3 Man kann die Funktion auch endrekursiv schreiben: 4 addall :: [Int] > Int 5 addall xs = addall xs 0 -- es wird ein Akkumulator übergeben 6 where 7 addall :: [Int] > Int > Int 8 addall [] akk = akk 9 addall (x:xs) akk = addall xs (akk+x) Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 28

Listen Folgende Funktion addiert alle Zahlen einer Liste: 1 addall :: [Int] > Int 2 addall [] = 0 3 addall (x:xs) = x + (addall xs) Reduktion: addall [1,2] 1 + (addall [2]) 1 + (2 + addall []) 1 + (2 + 0) 3 Man kann die Funktion auch endrekursiv schreiben: 4 addall :: [Int] > Int 5 addall xs = addall xs 0 -- es wird ein Akkumulator übergeben 6 where 7 addall :: [Int] > Int > Int 8 addall [] akk = akk 9 addall (x:xs) akk = addall xs (akk+x) Reduktion: addall [1,2] addall [1,2] 0 addall [2] (0+1) addall [] (1+2) 3 Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 28

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 29

Teamaufgabe Schreibt eine Funktion, welche die Auszahlung von Wechselgeld mit möglichst wenig Münzen berechnet. Dabei rechnen wir in Cent, um Gleitkommazahlen zu vermeiden. Mögliche Münzen sind: 1, 2, 5, 10, 20, 50, 100, 200 Beispiel: wechselgeld 249 => [200, 20, 20, 5, 2, 2] Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 30,

Teamaufgabe Schreibt eine Funktion, welche die Auszahlung von Wechselgeld mit möglichst wenig Münzen berechnet. Dabei rechnen wir in Cent, um Gleitkommazahlen zu vermeiden. Mögliche Münzen sind: 1, 2, 5, 10, 20, 50, 100, 200 Beispiel: wechselgeld 249 => [200, 20, 20, 5, 2, 2] Achtung: Lösung Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 30,

Teamaufgabe Schreibt eine Funktion, welche die Auszahlung von Wechselgeld mit möglichst wenig Münzen berechnet. Dabei rechnen wir in Cent, um Gleitkommazahlen zu vermeiden. Mögliche Münzen sind: 1, 2, 5, 10, 20, 50, 100, 200 Beispiel: wechselgeld 249 => [200, 20, 20, 5, 2, 2] Achtung: Lösung 1 wechselgeld :: Int > [Int] 2 wechselgeld betrag = helper betrag [200,100,50,20,10,5,2,1] [] 3 where 4 helper :: Int > [Int] > [Int] 5 helper betrag [] handtasche = handtasche 6 helper betrag (x:xs) handtasche 7 betrag >= x = helper (betrag x) (x:xs) (x:handtasche) 8 otherwise = helper betrag xs handtasche Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 30,

, Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive Datentypen Vergleiche & Operationen Parameterübergabe Typsynonyme Fallunterscheidung Rekursion Listen Teamaufgabe Quellen Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 31

, Quellen [1] Jann Heider. Shellbefehle. Website. 2016. URL: http://www.shellbefehle.de/befehle (besucht am 05. 09. 2016). [2] Thomas Krenn. Cmd-Befehle unter Windows. Website. 2015. URL: https://www.thomas-krenn.com/de/wiki/cmd-befehle_unter_windows (besucht am 05. 09. 2016). Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 32

Noch Fragen? Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 33

Noch Fragen? cool Freie Universität Berlin, Crashkurs Haskell, 02/11/2016 33