Grundprinzipien der funktionalen Programmierung



Ähnliche Dokumente
Funktionale Programmierung

Funktionale Programmierung mit Haskell

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:

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

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

Einführung in die Programmierung

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

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

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

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Scala kann auch faul sein

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

Einführung in die funktionale Programmierung

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

Berechnungsschemata: Funktion als Parameter abstrahiert Operation im Schema, wird bei Aufruf des Schemas konkretisiert

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

Funktionale Programmierung mit Haskell. Jan Hermanns

Diana Lange. Generative Gestaltung Operatoren

Lösungvorschlag zum Übungsblatt 6: Software-Entwicklung I (WS 2007/08)

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

Erwin Grüner

Inhalt Kapitel 5: Funktionen höherer Ordnung

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

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

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

Eigenwerte und Eigenvektoren von Matrizen

Felder. November 5, 2014

ALP I. Funktionale Programmierung

Vorkurs C++ Programmierung

Funktionale Programmierung

Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:

Computeranwendung und Programmierung (CuP)

Modul 122 VBA Scribt.docx

Grundlegende Datentypen

Ströme als unendliche Listen in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Einführung in die Java- Programmierung

Grundlegende Datentypen

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

Grundlegende Datentypen

Informationsblatt Induktionsbeweis

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

Funktionale Programmierung Grundlegende Datentypen

Programmieren in Haskell Einführung

Objektorientierte Programmierung

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

Übungen Programmieren 1 Felix Rohrer. Übungen

Programmierkurs Java

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

ALP I. Funktionale Programmierung

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

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

Repetitionsaufgaben Wurzelgleichungen

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

Grundlagen der Programmierung 2 (1.C)

Einführung in die Programmierung (EPR)

Paradigmen der Programmierung

Semantik von Formeln und Sequenzen

Funktionale Programmierung mit C++

5.4 Klassen und Objekte

13. Lineare DGL höherer Ordnung. Eine DGL heißt von n-ter Ordnung, wenn Ableitungen y, y, y,... bis zur n-ten Ableitung y (n) darin vorkommen.

Kapitel MK:IV. IV. Modellieren mit Constraints

Suchmaschinen. Universität Augsburg, Institut für Informatik SS 2014 Prof. Dr. W. Kießling 23. Mai 2014 Dr. M. Endres, F. Wenzel Lösungsblatt 6

Informatik Grundlagen, WS04, Seminar 13

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Programmierung und Modellierung

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

Terme stehen für Namen von Objekten des Diskursbereichs (Subjekte, Objekte des natürlichsprachlichen Satzes)

7 Rechnen mit Polynomen

Basiskonstrukte von Haskell

Java Einführung Operatoren Kapitel 2 und 3

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

Programmierung und Modellierung

Grundlagen Theoretischer Informatik I SoSe 2011 in Trier. Henning Fernau Universität Trier fernau@uni-trier.de

WS 2011/2012. RobertGiegerich. November 12, 2013

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

Funktionen höherer Ordnung

WS 2011/2012. RobertGiegerich. November 12, 2013

Grundlagen der Programmierung (Vorlesung 14)

WS 2012/2013. Robert Giegerich. 21. November 2012

Grundlagen der Programmierung 2. Bäume

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Gleichungen und Ungleichungen

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

Was ist Logische Programmierung?

Grundlagen der Künstlichen Intelligenz

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

SWP Prüfungsvorbereitung

Grundlagen der Videotechnik. Redundanz

Grundlagen der Programmierung 3 A

Einführung in die Programmierung

Deklarationen in C. Prof. Dr. Margarita Esponda

Primzahlen und RSA-Verschlüsselung

Java-Programmierung mit NetBeans

Einführung in die Programmierung für Wirtschaftsinformatik

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

DIFFERENTIALGLEICHUNGEN

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

Transkript:

Grundprinzipien der funktionalen Programmierung

Funktionen haben keine Seiteneffekte Eine Funktion berechnet einen Ausgabewert der nur von den Eingabewerten abhängt: 12 inputs + output 46 34 2

Nicht nur Zahlen, auch Bilder A function to flip a picture in a vertical mirror: input flipv output 3

Mehr Funktionen auf Bildern A function to invert the colours in a picture: invertcolour 4

Mehr Funktionen auf Bildern A function to superimpose two pictures: superimpose 5

Mehr Funktionen auf Bildern A function to put one picture above another: above 6

Mehr Funktionen auf Bildern A function to put two pictures side by side: sidebyside 7

Typen Ein Typ ist eine Menge von Werten, wie Zahlen oder Bilder. Auf alle Werte eines Typs sind die gleichen Funktionen anwendbar: Wir können zwei Zahlen addieren, nicht aber eine Zahl und ein Bild oder zwei Bilder. 8

Alles hat einen Typ Werte haben Typen: true : bool 1 : int Funktionen haben Typen: + : int -> int -> int above: picture -> picture -> picture 9

Klammerung von Typen Implizite Klammerung: T1 -> T2 -> T = T1 -> (T2 -> T) + : int -> int -> int + : (int -> int) -> int integrate: (real -> real) -> real -> real -> real integrate: real -> real -> real -> real -> real 10

Auswertung von Ausdrücken durch Termersetzung Ausdruck (7-3)+ 2 (7-3)+2 4+2 Auswertung Wert 4+2 6 11

sidebyside (invertcolour ) sidebyside Auswertung mit Bildern 12

Auswertungsstrategien f x = 1 g x = g x Eager evaluation / Call-by-value / Eifrige Auswertung: f(g 1) => f(g 1) =>... Prinzip: Zuerst die Parameter, dann die Funktion Lazy evaluation / Call-by-need / Verzögerte Auswertung: f(g 1) => 1 Prinzip: Parameter erst, wenn sie gebraucht werden 13

Auswertungsstrategien Wenn eifrige Auswertung terminiert, dann auch verzögerte Auswertung, und beide berechnen den gleichen Wert. SML: Eager evaluation Haskell: Lazy evaluation 14

Ausdrücke (Terme) Ein Ausdruck ist entweder atomar (z.b. x, true, 42) oder zusammengesetzt: f a1... an wobei f, a1,..., an Ausdrücke passenden Typs sind: f : T1 ->... -> Tn -> T ai : Ti 15

Klammerung von Ausdrücken Implizite Klammerung: f a b = (f a) b Funktionsanwendung ist nach links geklammert sin cos pi = (sin cos) pi sin(cos pi) integrate sin pi = (integrate sin) pi integrate (sin pi) 16

Präfix und Infix Infix: 3+4 ist Abkürzung für + 3 4 Präfix bindet stärker als Infix: f x+1 = (f x) + 1 17

Funktionale Programmierung in SML

The Web page... SML distributions and documentation. Background material: books, FAQs, etc... 19

Wertedefinitionen in SML Allgemeines Format: val name = expression Beispiele: val null = 0+0; val Horse = above horse horse; 20

Funktionsdefinitionen in SML Einfaches Format: fun name x1... xn = expression Beispiel: fun sum n = if n=0 then 0 else n+sum(n-1); 21

Funktionsdefinitionen in SML Mit Pattern Matching: fun name pat... pat = expression name pat... pat = expression... Beispiel: fun sum 0 = 0 sum n = n + sum(n-1) Reihenfolge der Gleichungen wichtig! 22

Lokale Definitionen: let let val x = 42 in x+x end => 42+42 => 84 let fun f x = x+1 in f(f 5) end... => 7 23

Typen in SML

Typinferenz SML berechnet automatisch den Typ jedes Ausdrucks val x = 42; >... : int fun f x = x+1; >... : int -> int 25

Polymorphismus Der Typ einer Funktion kann Typvariablen enthalten: a, b, name Ein solcher Typ heisst polymorph. fun f x = x; >... : a -> a f 5; > 5 : int f true; > true : bool 26

Polymorphismus fun S x y z = (x z) (y z); Was ist der Typ der Funktion? Typinferenz berechnet den allgemeinsten Typ. Polymorphismus ist ein Abstraktionsprinzip. 27

Basistypen bool int, real char, string 28

Booleans Everything is true or false 29

Vordefinierte Boolesche Operatoren if x:bool then y:t else z:t a andalso b = if a then b else false a orelse b = if a then true else b not a = if a then false else true 30

Beispiel Pattern Matching fun xor true true = false xor false true = true xor true false = true xor false false = false; 31

Arithmetik: int und real 42 : int 42.0 : real Funktionen: ~ + - * / div mod... Vergleiche: < <= > >= Infix syntax: 3 + 4 Präfix syntax: op + (3,4) op + : int * int -> int 32

Überladung Die meisten vordefinierten Operatoren (+,..., <,...) sind überladen, dh sowohl für int als auch real definiert. Benutzerdefinierte Funktionen dürfen nicht überladen sein: fun doppel x = x+x; > Fehlermeldung wg Überladung fun doppeli(x:int) = x+x; fun doppelr(x:real) = x+x; 33

Primitive Rekursion auf int Ein Schema oder Schablone: fun f 0 =... f n =... f(n-1)... Beispiel: 2er Potenzen. fun power2 0 = 1 power2 n = 2 * power2 (n-1); 34

Wie viele Teile nach n Schnitten? 35

Wie viele Teile nach n Schnitten? 0 Schnitte: 1 Teil. Mit dem n-ten Schnitt erhält man n weitere Teile: fun pieces 0 = 1 pieces n = pieces(n-1) + n; 36

Nicht alles ist primitiv rekursive fun ggt 0 n = n ggt m n = ggt (n mod m) m; 37

Characters Letters, digits and special characters. Literal characters are: #"a" Special characters are: #"\n" #"\t" #"\\" #"\" newline tab backslash double quote 38

Characters und strings "This is a string" : string Standardfunktionen: explode: string -> char list implode: char list -> string chr :: int -> char ord :: char -> int 39

Paare und Tupel (1,2) : int * int (1,2,true) : int * int * bool (1,(2,true)) : int * (int * bool) ((1,2),true) : (int * int) * bool fun fst(x,y) = x; fun snd(x,y) = y; fun swap(x,y) = (y,x); fun pair x = (x,x); 40

Listen T list: Listen von Element des Typs T Leere Liste: [] Cons : x :: xs Endliche Liste: [1,2,3] = 1::2::3::[] = 1::(2::(3::[])) 41

Zusammenfassung: Typen Τ ::= bool int... T * T T list (T,...,T)Typkonstruktor T -> T (T) Typvariable 42

Gleichheit op = : a * a -> bool a ist eine Typvariable über Gleichheitstypen. Gleichheitstypen sind (in erster Näherung) alle Typen ohne ->. 1 = 1 : bool not = not : Typfehler 43

Funktionen

Partielle Anwendung Sei f: T1 -> T2 -> T und a1:t1. Dann ist f a1 : T2 -> T eine partielle Anwendung. Bsp: Gegeben parser : grammar -> string -> bool Cgram : grammar kann man definieren val Cparser = parser Cgram > Cparser : string -> bool 45

Currying (nach Haskell B. Curry) fun f x y =... > : T1 -> T2 -> T fun f(x,y) =... > : T1 * T2 -> T f ist curried f ist gepaart 46

Funktionen höherer Stufe = Funktionen als Parameter integrate: (real -> real) ->... sort: ( a -> a -> bool) ->...... 47

Funktionen als Werte Lambda Kalkül: λx.e SML: fn x => e : T -> U falls x:t und e:u x ist formaler Parameter e ist Funktionskörper, d.h. Resultat Bsp: fn x => x+1 : int -> int (fn x => x+1) 41 => 42 48

fun, fn und val Parameter kann man von links nach rechts verschieben: fun f x y = e fun f x = fn y => e ist äquivalent zu fun ist val rec: fun g x = e val rec g = fn x => e ist äquivalent zu 49

Programmierung, Spezifikation und Verifikation mit Listen

Primitive Rekursion auf list Ein Schema oder Schablone: fun f [] =... f (x::xs) =... f xs... Beispiel: fun length [] = 1 length (x::xs) = length xs + 1; 51

Wichtige Funktionen auf Listen fun [] @ ys = ys (x::xs) @ ys = x :: (xs @ ys); fun concat [] = [] concat(xs::xss) = xs @ concat xss; Informell: concat [xs1,...,xsn] = xs1 @... @ xsn fun rev [] = [] rev (x::xs) = rev xs @ [x]; 52

map und filter fun map f [] = [] map f (x::xs) = f x :: map f xs Informell: map f [x1,...,xn] = [f x1,...,f xn] fun filter p [] = [] filter p (x::xs) = if p x then x :: filter p xs else filter p xs 53

Taking and... fun take n [] = [] take n (x:xs) = if n <= 0 then [] else x :: take (n-1) xs; fun takewhile p [] = [] takewhile p (x:xs) = if p x then x :: takewhile p xs else []; 54

... dropping Analog: drop : int -> a list -> a list dropwhile : ( a -> bool) -> a list -> a list 55

Zipping fun zipwith f (x::xs) (y::ys) = f x y :: zipwith f xs ys zipwith _ = []; Anwendung: zipwith??? [x1,...] [y1,...] = [(x1,y1),...] zipwith??? [x1,...] [y1,...] = [x1+y1,...] 56