Frank-André Rieÿ
Wofür benötigt man Monaden?
◮
Imperative Programmiersprahen:◮
◮
Wofür benötigt man Monaden?
◮
Imperative Programmiersprahen:◮
Zugriauf Variablen/Referenzen implizite
Zustandsveränderungmöglih
◮
Exeptions et. Beeinussung des Kontrollusses
zurFehlerbehandlung
◮
◮
Exeptions et. Beeinussung des Kontrollusses
zurFehlerbehandlung
◮
Funktionale Programmiersprahen:◮
nur Zugriauf Argumente einerFunktion
Zustandsveränderungen müssen durh explizite
Änderung eines Zustandsobjektes simuliert
Wofür benötigt man Monaden?
◮
Imperative Programmiersprahen:◮
Zugriauf Variablen/Referenzen implizite
Zustandsveränderungmöglih
◮
Exeptions et. Beeinussung des Kontrollusses
zurFehlerbehandlung
◮
Funktionale Programmiersprahen:◮
nur Zugriauf Argumente einerFunktion
Zustandsveränderungen müssen durh explizite
Änderung eines Zustandsobjektes simuliert
werden
◮
Fehlerbehandlung nur explizit über(z.B.
zusammengesetzten) Rükgabewert oder
Wünshenswert: Möglihkeit, das Zustandsobjekt
(et.) unsihtbar zu mahen..
◮
..durh Einbau unreiner Züge in die
◮
..durh Einbau unreiner Züge in die
Programmiersprahe dadurh aber Verlust der
Wünshenswert: Möglihkeit, das Zustandsobjekt
(et.) unsihtbar zu mahen..
◮
..durh Einbau unreiner Züge in die
Programmiersprahe dadurh aber Verlust der
referenziellen Transparenz (der Wert eines
Ausdruks ist niht mehr unabhängig vom
◮
..durh Einbau unreiner Züge in die
Programmiersprahe dadurh aber Verlust der
referenziellen Transparenz (der Wert eines
Ausdruks ist niht mehr unabhängig vom
Zeitpunkt seiner Auswertung)
◮
..durh geeignete Abstraktion, die den ZustandFunktion ohne Zustand:
x
−→
f−→
yf
: α → β
f
: α → β
Funktion mit explizitem Zustand:
x
z
alt
−→
fZustand−→
y
z
neu
f
Zustand
: ( α,
s) → ( β,
s)
Funktion mit explizitem Zustand:
x
z
alt
−→
fZustand−→
y
z
neu
f
Zustand
: ( α,
s) → ( β,
s)
x
z
alt
−→
fZustand−→
y
z
neu
f
Zustand
: ( α,
s) → ( β,
s)
Funktion mit explizitem Zustand:
x
z
alt
−→
fZustand−→
y
z
neu
f
Zustand
: ( α,
s) → ( β,
s)
Currying..
x
−→
fZustand′ −→
z
alt
→
fZustand′
x→
y
z
neu
f
′
Zustand
: α →
s→ ( β,
s)
x
−→
fZustand′ −→
z
alt
→
fZustand′
x→
y
z
neu
f
′
Zustand
: α →
s→ ( β,
s)
x
−→
fZustand′ −→
z
alt
→
fZustand′
x→
y
z
neu
f
′
Zustand
: α →
s→ ( β,
s)
x
−→
fZustand′ −→
z
alt
→
fZustand′
x→
y
z
neu
f
′
Zustand
: α →
s→ ( β,
s)
Sei
τ β =
s→ ( β,
s)
der Typ allerzustandsabhängigen Berehnungen,die ein Ergebnis
von Typ
β
liefern.von Typ
β
liefern.Sei
τ β =
s→ ( β,
s)
der Typ allerzustandsabhängigen Berehnungen,die ein Ergebnis
von Typ
β
liefern.Man kann sih nun Getter und Setter denieren:
get
:
s→ (
s,
s) = τ
svon Typ
β
liefern.Man kann sih nun Getter und Setter denieren:
get
:
s→ (
s,
s) = τ
s get= λ
z→ (
z,
z)
Sei
τ β =
s→ ( β,
s)
der Typ allerzustandsabhängigen Berehnungen,die ein Ergebnis
von Typ
β
liefern.Man kann sih nun Getter und Setter denieren:
get
:
s→ (
s,
s) = τ
s get= λ
z→ (
z,
z)
set
:
s→
s→ (() ,
s) =
s→ τ ()
von Typ
β
liefern.Man kann sih nun Getter und Setter denieren:
get
:
s→ (
s,
s) = τ
s get= λ
z→ (
z,
z)
set
:
s→
s→ (() ,
s) =
s→ τ ()
setz
= λ
_→ (() ,
z)
τ β =
s→ ( β,
s)
τ β =
s→ ( β,
s)
Werte in eine Zustandsberehnung hineinbringen:
return
: α → τ α
Werte in eine Zustandsberehnung hineinbringen:
return
: α → τ α
returnx
= λ
z→ (
x,
z)
τ β =
s→ ( β,
s)
Werte in eine Zustandsberehnung hineinbringen:
return
: α → τ α
returnx
= λ
z→ (
x,
z)
Zwei Zustandsberehnungen hintereinander
Werte in eine Zustandsberehnung hineinbringen:
return
: α → τ α
returnx
= λ
z→ (
x,
z)
Zwei Zustandsberehnungen hintereinander
τ β =
s→ ( β,
s)
Werte in eine Zustandsberehnung hineinbringen:
return
: α → τ α
returnx
= λ
z→ (
x,
z)
Zwei Zustandsberehnungen hintereinander
ausführen:
bind
: τ α → ( α → τ
beta
) → τ
b etaWerte in eine Zustandsberehnung hineinbringen:
return
: α → τ α
returnx
= λ
z→ (
x,
z)
Zwei Zustandsberehnungen hintereinander
ausführen:
bind
: τ α → ( α → τ
beta
) → τ
b etaf bindg