• Keine Ergebnisse gefunden

Funktionale Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Funktionale Programmierung"

Copied!
399
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Funktionale

Programmierung

Funktionen und Phänomene

Funktionen höherer Ordnung - Funktionale

Parameterübergabe

Formularmaschine - Auswertung von Funktionen

Rekursion

Polymorphie

(2)

Funktionale Programmierung

Motivation

Daten Funktionen Operationen auf Daten

Verwischen der Trennung von Daten und Operationen

Verwischen der Unterscheidung von

Objektbeschreibung und Handlungsanweisung

Verschmelzen von Daten und Operationen

(3)

Funktionale Programmierung

Funktionen höherer Ordnung

Bekanntlich: Funktionenraum typ D [D'→D"]

Falls D', D'' wieder Funktionenräume, so

bildet f D Funktionen aus D' auf Funktionen aus D" ab

f heißt Funktion höherer Ordnung (higher order function, Abk. HOF) oder Funktional

(4)

Funktionale Programmierung

HOF - typisches Beispiel 1

A={f: IR→IR | f ist integrierbar}

B={f: IR→IR | f ist Funktion}.

Integral ∫: A→B ist Funktional, das jeder integrierbaren Funktion f reellwertige Funktion F, die Stammfunktion, zuordnet:

∫(f)=F mit

∫ f(t) dt=F(x)

∫ [[real→real]→[real→real]].

0 x

(5)

Funktionale Programmierung

HOF - typisches Beispiel 2

Ableitungsoperator ' ist Funktional

': {f: IR→IR | f ist differenzierbar}

→{f: IR→IR | f ist Funktion}

das jeder differenzierbaren Funktion ihre Ableitungsfunktion zuordnet:

'(f)=f'

' [[real→real]→[real→real]]

(6)

Funktionale Programmierung

HOF - typisches Beispiel 3

Summation: a,b Z und f: Z→Z:

Σ f(i)=f(a)+f(a+1)+f(a+2)+...+f(b).

Fasse Summe als Funktion S auf mit f: ZZ und Grenzen a,b Z als Argumenten

S: {f: Z→Z }×Z×Z→Z mit S(f,a,b)= Σ f(i).

S ist vom Datentyp D mit

typ D [([intint], int, int)int].

i=a b

i=a b

(7)

Funktionale Programmierung

HOF - typisches Beispiel 4

Komposition: Selbstanwendung einer Funktion f twice: [int→int]→[int→int] mit

twice(f)=f°f.

Zum Beispiel:

twice(pred)=pred°pred und

twice(pred) (7)=pred(pred(7))=5.

Allgemeine Komposition:

komp: [A→B]×[C→A]→[C→B] mit komp(f,g)=f°g.

komp [([A→B],[C→A])→[C→B]].

(8)

Funktionale Programmierung

HOF - Definition

Definition:

Daten sind nullstellige Funktionen, besitzen die Ordnung 0 und heißen Konstanten.

Die Ordnung einer Funktion ist das

Maximum der Ordnungen ihrer Argumente zuzüglich 1.

Funktionen der Ordnung ≥2 heißen auch Funktionale.

(9)

Funktionale Programmierung

HOF - Beispiele

(10)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

(11)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

∫ [[real→real]→[real→real]]

(12)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

(13)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

' [[real→real]→[real→real]]

(14)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

(15)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

komp [([A→B],[C→A])→[C→B]]

(16)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

(17)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

twice: [int→int]→[int→int]

(18)

Funktionale Programmierung

HOF - Beispiele

1. Funktionen vorigen Beispielen besitzen alle Ordnung 2:

2. Die Konstante 17 besitzt Ordnung 0. Man kann sie interpretieren als nullstellige

Funktion

17: unit→nat mit 17()=17.

twice: [int→int]→[int→int]

(19)

Funktionale Programmierung

Currying

Idee: partielle Auswertung von Funktionen

liefere die Argumente der Reihe nach zu

betrachte “Zwischenfunktionen” als Funktionen auf den Restargumenten

Beachte: Als Tupel müssen die Argumente der Funktion immer en bloc zugeführt

werden

(20)

Funktionale Programmierung

Currying - Motivation

Multiplikation

mult: IR×IR→IR mit

mult(x,y)=xy (eigentlich: mult ((x,y)) )

mult ist “vernünftig”, wenn es nur partiell ausgewertet wird, z.B.

d: IR→IR mit d=mult(2,·) bzw. d(x)=mult(2,x)

oderDollarDM: IR→IR mit DollarDM=mult(1.521,·)

(21)

Funktionale Programmierung

Currying - Motivation

Multiplikation

mult: IR×IR→IR mit

mult(x,y)=xy (eigentlich: mult ((x,y)) )

mult ist “vernünftig”, wenn es nur partiell ausgewertet wird, z.B.

d: IR→IR mit d=mult(2,·) bzw. d(x)=mult(2,x)

oderDollarDM: IR→IR mit DollarDM=mult(1.521,·)

Dies darf man so nicht schreiben

(22)

Funktionale Programmierung

Currying - 2-stellig

Currying: Übergang von 2-stelliger Funktion f: A×B→C mit f(a,b)=c

zu Funktion 2. Ordnung

F: A→(B→C)

die man partiell auswerten kann: zunächst a zuführen und Funktion 1. Ordnung erhalten:

F(a): B→C

dann auf b anwenden und Ergebnis erhalten:

F(a)(b)=f(a,b)

(23)

Funktionale Programmierung

Currying - 2-stellig

Currying: Übergang von 2-stelliger Funktion f: A×B→C mit f(a,b)=c

zu Funktion 2. Ordnung

F: A→(B→C)

die man partiell auswerten kann: zunächst a zuführen und Funktion 1. Ordnung erhalten:

F(a): B→C

dann auf b anwenden und Ergebnis erhalten:

F(a)(b)=f(a,b)

Uncurrying

(24)

Funktionale Programmierung

Currying - n-stellig

Currying: Übergang von n-stelliger Funktion f: A1×...×An→B

zu Funktion n-ter Ordnung

F: A1→(A2→(A3→...→(An→B)...)) mit F(a1)(a2)(a3)...(an)=f(a1,a2,a3,...,an).

Eindeutige Zuordnung (Beweis s. Übungen)

Schreibweise: F a1 a2 a3 ... an

dabei linksassoziative Interpretation:

(...(((F(a1)a2)a3)...an)

im folgenden fast immer gecurryte Schreibweise

(25)

Funktionale Programmierung

Informatischer Funktionsbegriff

1. Forderung: [D'→D”] nur berechenbare Funktionen 2. Forderung: Beschreibung von Funktionen durch

ausführbare Rechenvorschriften

Beispiel: Mathematik:

ggT: IN0×IN0→IN0 mit

ggT(a,b)=max{t IN0 | t\a und t\b}

Brauchbarer: Effektiv ausführbare Rechenvorschrift zur Konstruktion des Ergebnisses:

a, falls a=b,

ggT(a,b)= ggT(b,a), falls a<b, ggT(a-b,b), sonst.

{

(26)

Funktionale Programmierung

Informatischer Funktionsbegriff

a, falls a=b,

ggT(a,b)= ggT(b,a), falls a<b, ggT(a-b,b), sonst.

Rechne:

ggT(40,12)=ggT(28,12)=ggT(16,12)=ggT(4,12)

=ggT(12,4)=ggT(8,4)=ggT(4,4)=4.

Ausführbare Beschreibungen von Funktionen nennt man Rechenvorschriften.

{

(27)

Funktionale Programmierung

Informatischer Funktionsbegriff

a, falls a=b,

ggT(a,b)= ggT(b,a), falls a<b, ggT(a-b,b), sonst.

Rechne:

ggT(40,12)=ggT(28,12)=ggT(16,12)=ggT(4,12)

=ggT(12,4)=ggT(8,4)=ggT(4,4)=4.

Ausführbare Beschreibungen von Funktionen nennt man Rechenvorschriften.

{

Ist diese Def. sinnvoll?

(selbstbezüglich, rekursiv)

(28)

Funktionale Programmierung

Rechenvorschriften

Definition:

Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift.

Allgemeine Definition:

funktion f x1:D1 x2:D2 ... xn:Dn → D R.

f Bezeichner der Rechenvorschrift

x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn

D Datentyp des Funktionsergebnisses

Funktionalität von f: D1→(D2→(D3→...(Dn→D)...))

R Ausdruck (Term) vom Typ D induktiv wie folgt definiert:

(29)

Funktionale Programmierung

Rechenvorschriften

Definition:

Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift.

Allgemeine Definition:

funktion f x1:D1 x2:D2 ... xn:Dn → D R.

f Bezeichner der Rechenvorschrift

x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn

D Datentyp des Funktionsergebnisses

Funktionalität von f: D1→(D2→(D3→...(Dn→D)...))

R Ausdruck (Term) vom Typ D induktiv wie folgt definiert:

Kopf Rumpf

(30)

Funktionale Programmierung

Rechenvorschriften

Definition:

Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift.

Allgemeine Definition:

funktion f x1:D1 x2:D2 ... xn:Dn → D R.

f Bezeichner der Rechenvorschrift

x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn

D Datentyp des Funktionsergebnisses

Funktionalität von f: D1→(D2→(D3→...(Dn→D)...))

R Ausdruck (Term) vom Typ D induktiv wie folgt definiert:

(31)

Funktionale Programmierung

Rechenvorschriften

Definition:

Die funktionale Beschreibung eines Algorithmus nennt man Rechenvorschrift.

Allgemeine Definition:

funktion f x1:D1 x2:D2 ... xn:Dn → D R.

f Bezeichner der Rechenvorschrift

x1,...,xn paarweise verschiedene formale Parameter der Datentypen D1,...,Dn

D Datentyp des Funktionsergebnisses

Funktionalität von f: D1→(D2→(D3→...(Dn→D)...))

R Ausdruck (Term) vom Typ D induktiv wie folgt definiert:

vollständig gecurryed

(32)

Funktionale Programmierung

Rechenvorschriften

Definition (Forts.):

Elementare Bausteine:

(1) E elementarer Typ und x E x Ausdruck vom Typ E (2) Für i=1,...,n ist xi Ausdruck vom Typ Di

Konstruktoren:

(3) g Rechenvorschrift der Funktionalität E'→E" und A Ausdruck vom Typ E' g(A) Ausdruck vom Typ E"

(Konstruktor "Einsetzung" oder – für g=f – Konstruktor

"Rekursion").

(33)

Funktionale Programmierung

Rechenvorschriften

Definition (Forts.):

(4) A1 und A2 beliebige Ausdrücke vom Typ E und B ein Ausdruck vom Typ bool

wenn B dann A1 sonst A2 ende

Ausdruck vom Typ E (Konstruktor "Alternative", bedingter Ausdruck)

(5) A Ausdruck vom Typ E (A) Ausdruck vom Typ E.

Funktionen, die im Rumpf von f verwendet werden, heißen Stützfunktionen von f.

Ein funktionales Programm ist eine Folge f1,...,fk von Funktionsdefinitionen.

(34)

Funktionale Programmierung

Beispiele

1. ggT (s. o.)

funktion ggT a:nat b:nat → nat wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende.

2. Absolutfunktion:

funktion abs x:real → real wenn x≥0 dann x sonst -x ende.

3. Signum-Funktion:

typ vorzeichen {-1,0,1};

funktion sign x:real → vorzeichen wenn x<0 dann -1 sonst

wenn x=0 dann 0 sonst 1 ende ende.

(35)

Funktionale Programmierung

Beispiele

4. Multiplikation und Verdoppelung:

funktion mult x:int y:int int x*y.

funktion d mult 2.

5. Konstanten als Funktionen:

funktion pi real 3.1415926;

funktion kreisfläche r:real real pi*r*r.

(36)

Funktionale Programmierung

Beispiele

4. Multiplikation und Verdoppelung:

funktion mult x:int y:int int x*y.

funktion d mult 2.

5. Konstanten als Funktionen:

funktion pi real 3.1415926;

funktion kreisfläche r:real real pi*r*r.

weder Parameter, noch Typen angeben

(37)

Funktionale Programmierung

Beispiele

4. Multiplikation und Verdoppelung:

funktion mult x:int y:int int x*y.

funktion d mult 2.

5. Konstanten als Funktionen:

funktion pi real 3.1415926;

funktion kreisfläche r:real real pi*r*r.

weder Parameter, noch Typen angeben

(38)

Funktionale Programmierung

Beispiele

4. Multiplikation und Verdoppelung:

funktion mult x:int y:int int x*y.

funktion d mult 2.

5. Konstanten als Funktionen:

funktion pi real 3.1415926;

funktion kreisfläche r:real real pi*r*r.

(39)

Funktionale Programmierung

Beispiele

4. Multiplikation und Verdoppelung:

funktion mult x:int y:int int x*y.

funktion d mult 2.

5. Konstanten als Funktionen:

funktion pi real 3.1415926;

funktion kreisfläche r:real real pi*r*r.

(40)

Funktionale Programmierung

Beispiele

4. Multiplikation und Verdoppelung:

funktion mult x:int y:int int x*y.

funktion d mult 2.

5. Konstanten als Funktionen:

funktion pi real 3.1415926;

funktion kreisfläche r:real real pi*r*r.

weder Parameter, noch Typ, da konstante

Funktion

(41)

Funktionale Programmierung

Beispiele

6. Mischen:

typ intlist {leer} | (int,intlist);

funktion misch f:intlist g:intlist → intlist wenn f=leer dann g sonst

wenn g=leer dann f sonst

wenn (erstes f)<(erstes g) dann (erstes f,misch (rest f) g) sonst (erstes g,misch f (rest g)) ende

ende ende .

(42)

Funktionale Programmierung

Applikation

Operation auf Rechenvorschriften, die zu Werten führt

Gegeben:

funktion f x1:D1 ... xn:Dn → D R.

Anwendung/Applikation/Aufruf:

f a1 a2 ... an

Substitution: Umwandlung des Rumpfs R in

einen auswertbaren Ausdruck durch Ersetzung der formalen Parameter xi durch aktuelle Parameter ai

(43)

Funktionale Programmierung

Substitution - Beispiel

ggT:

funktion ggT a: nat b: nat nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

Bei Aufruf ggT 40 12 geht Rumpf über in wenn 40=12 dann 40 sonst

wenn 40<12 dann ggT 12 40 sonst ggT (40-12) 12 ende ende

(44)

Funktionale Programmierung

Substitution - Beispiel

ggT:

funktion ggT a: nat b: nat nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

Bei Aufruf ggT 40 12 geht Rumpf über in wenn 40=12 dann 40 sonst

wenn 40<12 dann ggT 12 40 sonst ggT (40-12) 12 ende ende

Beachte Klammer- setzung

(45)

Funktionale Programmierung

Substitutionsregeln

Gegeben: funktion f x:D → D' R.

Aufruf: f E

Freiheitsgrade bei der Substitution:

wann wird E ausgewertet

vor der Substitution von x durch E

nach der Substitution von x durch E

wie oft wird E ausgewertet

an jeder Stelle, an der x vorkommt

einmalig

(46)

Funktionale Programmierung

Call by value - Wertübergabe

Vorschrift: Um f(E) zu berechnen, werte zunächst E aus. Ersetze x überall im Rumpf R durch Wert von E und werte den so

modifizierten Rumpf aus.

(47)

Funktionale Programmierung

Call by value - Wertübergabe

Beispiel:

(48)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) Beispiel:

(49)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) d(d(3+3)) Beispiel:

(50)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) d(d(3+3)) Beispiel:

d(d 6)

(51)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) d(d(3+3)) Beispiel:

d(d 6) d(6+6)

(52)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) d(d(3+3)) Beispiel:

d(d 6) d(6+6)

d 12

(53)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) d(d(3+3)) Beispiel:

d(d 6) d(6+6)

d 12 12+12

(54)

Funktionale Programmierung

Call by value - Wertübergabe

d(d(d 3)) d(d(3+3)) Beispiel:

d(d 6) d(6+6)

d 12 12+12

24

(55)

Funktionale Programmierung

Call by value - Wertübergabe

Vorteil: entspricht mathematischer Tradition Nachteil 1: manchmal ineffizient

Beispiel: funktion null x:int → int 0.

null(d(d(d 3))) null(d(d(3+3)))

null(d(d 6)) null(12+12) null 24 0 umfängliche Auswertung, obwohl Ergebnis 0 von Anfang an feststeht

(56)

Funktionale Programmierung

Call by value - Wertübergabe

Nachteil 2: Inkonsequenz erforderlich.

Beispiel:

wenn b dann e sonst e' ende=wenn(b,e,e') Betrachte:

funktion p x:int → int

wenn x=0 dann 1 sonst p(x-1) ende

=wenn(x=0,1,p(x-1))

Dann p x=1 für alle x≥0, aber p 0 wenn(0=0,1,p(-1))

wenn(true,1,p(-1=0,1,p(-2)))=wenn(true,1,p (false,1,p(-2))) ...

(57)

Funktionale Programmierung

Call by value - Wertübergabe

Nachteil 2: Inkonsequenz erforderlich.

Beispiel:

wenn b dann e sonst e' ende=wenn(b,e,e') Betrachte:

funktion p x:int → int

wenn x=0 dann 1 sonst p(x-1) ende

=wenn(x=0,1,p(x-1))

Dann p x=1 für alle x≥0, aber p 0 wenn(0=0,1,p(-1))

wenn(true,1,p(-1=0,1,p(-2)))=wenn(true,1,p (false,1,p(-2))) ...

Abweichung von call-by-value nötig, um bed. Ausdruck

überhaupt auswerten zu können

(58)

Funktionale Programmierung

Call by name - Namensübergabe

Vorschrift: Um f(E) zu berechnen, ersetze x überall im Rumpf R durch den Text von E und werte den so modifizierten Rumpf aus.

(59)

Funktionale Programmierung

Call by name - Namensübergabe

Beispiel:

(60)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3)) Beispiel:

(61)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) Beispiel:

(62)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

Beispiel:

(63)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

Beispiel:

3+3

(64)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3

(65)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3

(66)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6

(67)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6 12=

(68)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6

(d 3)+(d 3) 12=

(69)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6

(d 3)+(d 3) 3+3

12=

(70)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6 3+3 12=

(71)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6

3+3 3+3 12=

(72)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6

3+3 3+3 6 12=

(73)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6

=12 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6

3+3 3+3 6 12=

(74)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6

=12

=24 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6

3+3 3+3 6 12=

(75)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6

=12

=24

=24 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6

3+3 3+3 6 12=

(76)

Funktionale Programmierung

Call by name - Namensübergabe

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

6

=12

=24

=24 Beispiel:

3+3 3+3 6

(d 3)+(d 3)

6

3+3 3+3 6 12=

ineffizient durch wiederholte

Auswertung desselben Ausdrucks

(77)

Funktionale Programmierung

Call by name - Namensübergabe

(78)

Funktionale Programmierung

Call by name - Namensübergabe

Andererseits:

(79)

Funktionale Programmierung

Call by name - Namensübergabe

Andererseits:

Beispiel: funktion null x:int → int 0.

null(d(d(d 3))) 0 (sehr effizient)

(80)

Funktionale Programmierung

Call by name - Namensübergabe

Andererseits:

Beispiel: funktion null x:int → int 0.

null(d(d(d 3))) 0 (sehr effizient)

3. Strategie kombiniert beide Aspekte

(81)

Funktionale Programmierung

Call by need - lazy evaluation

Vorschrift: Um f(E) zu berechnen, ersetze x überall in R textuell durch E und werte den modifizierten Rumpf aus. Sobald E zum ersten Mal ausgewertet wird, ersetze E im Rumpf

überall durch den berechneten Wert.

(82)

Funktionale Programmierung

Call by need - lazy evaluation

Beispiel:

(83)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3)) Beispiel:

(84)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) Beispiel:

(85)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

Beispiel:

(86)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 Beispiel:

(87)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 6 Beispiel:

(88)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 6 Beispiel:

(89)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 6

=12 Beispiel:

(90)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 6

=12 Beispiel:

(91)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 6

=12

=24 Beispiel:

(92)

Funktionale Programmierung

Call by need - lazy evaluation

d(d(d 3))

d(d 3)+d(d 3) (d 3)+(d 3)

3+3 6

=12

=24

=24 Beispiel:

(93)

Funktionale Programmierung

Call by need - lazy evaluation

Realisierung:

Vorkommen von

formalen Parametern durch Verweise auf zugehörige

Argumente ersetzen

(94)

Funktionale Programmierung

Call by need - Sonderfall - lazy lists

Beispiel: null(2 div 0)=0 und nicht undefiniert

Gefeierte Anwendung: lazy lists

Möglichkeit, prinzipiell unendliche Objekte zu definieren und mit ihnen zu operieren

(95)

Funktionale Programmierung

Substitutionsregeln

Rest der Vorlesung: call by value

neue (funktionale) Programmiersprache FUN:

Typkonzept aus Kapitel 9

Funktionskonzept aus Kapitel 10

call-by-value-Substitution

(96)

Funktionale Programmierung

Formularmaschine

Formularmaschine = algorithmisches

Verfahren zur systematischen Auswertung von funktionalen Programmen

fomularmäßige Darstellung von Funktionsdefinitionen

geordnete Auswertung von Funktionen

graphische übersichtliche Darstellung

anschaulicher Beleg für Automatisierbarkeit funktionaler Programmierung

(97)

Funktionale Programmierung

Formularmaschine

Definition:

Geg.: Rechenvorschrift

funktion f x1:D1 ... xn:Dn → D R.

Ein Formular für f ist ein (geordnetes) Paar geordneter markierter Bäume (B0,B(R))mit:

(98)

Funktionale Programmierung

Formularmaschine

B0 repräsentiert Kopf der Rechenvorschrift:

(99)

Funktionale Programmierung

Formularmaschine

B0 repräsentiert Kopf der Rechenvorschrift:

Funktionsbezeichner f

(100)

Funktionale Programmierung

Formularmaschine

B0 repräsentiert Kopf der Rechenvorschrift:

(101)

Funktionale Programmierung

Formularmaschine

B0 repräsentiert Kopf der Rechenvorschrift:

formale Parameter xi

(102)

Funktionale Programmierung

Formularmaschine

B0 repräsentiert Kopf der Rechenvorschrift:

(103)

Funktionale Programmierung

Formularmaschine

B0 repräsentiert Kopf der Rechenvorschrift:

konkrete Werte

(104)

Funktionale Programmierung

Formularmaschine

B(R) repräsentiert Rumpf der Rechenvorschrift und ist induktiv wie folgt aufgebaut:

1. x Konstante, dann Baum B(x)

2. x formaler Parameter, dann Baum B(x)

(105)

Funktionale Programmierung

Formularmaschine

3. A1,...,Ak Ausdrücke mit zugehörigen Formularen B(A1),...,B(Ak).

Aufruf (f A1 ... Ak) einer k-stelligen Funktion f, dann Baum B(f):

(106)

Funktionale Programmierung

Formularmaschine

4. b boolescher Ausdruck mit Formular B(b), A und A' beliebige Ausdrücke mit Formularen B(A) und B(A').

Zum Ausdruck

wenn b dann A sonst A' ende gehört das Formular B(wenn) mit:

(107)

Funktionale Programmierung

Formularmaschine

4. b boolescher Ausdruck mit Formular B(b), A und A' beliebige Ausdrücke mit Formularen B(A) und B(A').

Zum Ausdruck

wenn b dann A sonst A' ende gehört das Formular B(wenn) mit:

gestrichelte Linien für Alternative

(108)

Funktionale Programmierung

Formularmaschine

5. A1,...,Ak Ausdrücke mit zugehörigen Formularen B(A1),...,B(Ak).

Für Tupelausdruck (A1,...,Ak) ist das zugehörige Formular B((A1,...,Ak)) der Baum:

(109)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(110)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(111)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(112)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(113)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(114)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(115)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(116)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(117)

Funktionale Programmierung

Beispiele

1. Absolutfunktion

funktion abs x:real→real wenn x≥0 dann x sonst -x ende

(118)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(119)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(120)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(121)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(122)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(123)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(124)

2. ggT:

funktion ggT a: nat b: nat → nat;

wenn a=b dann a sonst

wenn a<b dann ggT b a sonst ggT (a-b) b ende ende

(125)

Funktionale Programmierung

Formularmaschine - Anwendung

Wie rechnet man mit der Formularmaschine?

Excel-Paradigma

Formularfelder mit Werten belegen

Felder verknüpfen, Ergebnisse in andere Felder übertragen

Ergebnisse aus-/ablesen

(126)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

(127)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7

(128)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7

-7

(129)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7 -7

-7

(130)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7 -7

-7 +7

(131)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7 -7

-7 +7

false

(132)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7 -7

-7 +7

false

(133)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7 -7

-7 +7

false

+7

(134)

Funktionale Programmierung

Formularmaschine - Beispiel abs

abs(-7)

-7

-7 -7

-7 +7

false

+7 +7

(135)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

(136)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6

(137)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

(138)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

(139)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6

(140)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

(141)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6

(142)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 6

(143)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

6

(144)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 6

(145)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

6

(146)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4 6

(147)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

(148)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

false

(149)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

false

false

(150)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

false

false

2

(151)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

false

false

2

(152)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

false

false

2

(153)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 6 4

6 4

6

6 6

6 4

4 4

4

4 6

false

false

2

(154)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

(155)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2

(156)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

(157)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

(158)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2

(159)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

(160)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2

(161)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 2

(162)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

2

(163)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 2

(164)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

2

(165)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4 2

(166)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

(167)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

false

(168)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

false

true

(169)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

false

true

-2

(170)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

false

true

-2

(171)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

false

true

-2

(172)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 2 4

2 4

2

2 2

2 4

4 4

4

4 2

false

true

-2

(173)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

(174)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4

(175)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

(176)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

(177)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4

(178)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

(179)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4

(180)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 4

(181)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

4

(182)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 4

(183)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

4

(184)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

2 4

(185)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

2

2 4

(186)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

2

2 4

false

(187)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

2

2 4

false

false

(188)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

2

2 4

false

false

2

(189)

Funktionale Programmierung

Formularmaschine - Beispiel ggT 4 2

4 2

4

4 4

4 2

2 2

2

2 4

false

false

2

Referenzen

ÄHNLICHE DOKUMENTE

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 15.11.2016: Funktionen Höherer Ordnung I..

[r]

I Eine Funktion hat ein Speicherleck, wenn Speicher unnötig lange im Zugriff bleibt. I “Echte” Speicherlecks wie in C/C++

I Striktheit: Speicherlecks vermeiden (bei verzögerter Auswertung) I Vorteil: Effizienz muss nicht im Vordergrund stehen. PI3 WS 16/17

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I..

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I.. Christoph Lüth Universität Bremen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 6 vom 18.11.2014: Funktionen Höherer Ordnung II..

Praktische Informatik 3: Funktionale Programmierung Vorlesung 6 vom 18.11.2014: Funktionen Höherer Ordnung II.. Christoph Lüth Universität Bremen