• Keine Ergebnisse gefunden

Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 03.11.09: Mehr ¨uber Monaden

N/A
N/A
Protected

Academic year: 2022

Aktie "Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 03.11.09: Mehr ¨uber Monaden"

Copied!
19
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 03.11.09:

Mehr ¨uber Monaden

Christoph L¨uth, Dennis Walter

Universit¨at Bremen

Wintersemester 2009/10

(2)

Heute gibt’s:

I Monaden, mehrMonaden, und noch mehr Monaden

I Die Monaden der Standardb¨ucherei

I Referenz:http://www.haskell.org/all˙about˙monads/html

(3)

Fahrplan

I Teil I: Monaden und fortgeschrittene Typen

I Einf¨uhrung, Wiederholung

I Zust¨ande, Zustands¨uberg¨ange undIO

I Reader/Writer, Nichtdeterminismus, Ausnahmen

I Monadentransformer

I Teil II: Fortgeschrittene Datenstrukturen

I Teil III: Nebenl¨aufigkeit

I Teil IV: The Future of Programming

(4)

Die Identit¨ atsmonade

I Die allereinfachste Monade:

type I d a = a

i n s t a n c e Monad I d where r e t u r n a = a

b = f = f b

(5)

Fehlermonaden

I Erste N¨ahrung:Maybe

I Maybe kennt nurNothing, daher strukturierte Fehler:

data E i t h e r a b = L e f t a | Right b type E r r o r a = E i t h e r S t r i n g a i n s t a n c e Monad ( E i t h e r S t r i n g ) where

( Right a ) = f = f a ( L e f t l ) = f = L e f t l r e t u r n b = Right b

I Nachteil: Fester Fehlertyp

I L¨osung: Typklassen

(6)

Die Monade Control.Monad.Error

I TypklasseError f¨ur Fehler c l a s s E r r o r a where

noMsg : : a

strMsg : : S t r i n g a

I Fehlermonade parametrisiert ¨ubere:

c l a s s (Monad m) MonadError e m where t h r o w E r r o r : : e m a

c a t c h E r r o r : : m a ( e m a ) m a

i n s t a n c e MonadError ( E i t h e r e ) where t h r o w E r r o r = L e f t

( L e f t e ) ‘ c a t c h E r r o r ‘ h a n d l e r = h a n d l e r e a ‘ c a t c h E r r o r ‘ = a

(7)

Die Zustandsmonade

I

I Zustands¨ubergang als Funktion

newtype S t a t e s a = S t a t e {unwrap : : ( s ( a , s ) )} i n s t a n c e Monad ( S t a t e s ) where

r e t u r n a = S t a t e $ λs ( a , s )

( S t a t e g ) = f = S t a t e ( u n c u r r y g . unwrap f )

I Nachteil 1:Zustands¨ubergangnicht-strikt (insbesonderelazy)!

I L¨osung:Strikter Zustands¨ubergang—Control.Monad.ST

I Nachteil 2:Zustands¨ubergang Funktion

I L¨osung:Typklassen

(8)

Die Monad Control.Monad.State

I TypklasseState f¨ur Zustand lesen/schreiben:

c l a s s MonadState m s where get : : m s

put : : s m ( )

I Zustandsmonade parametrisiert ¨uberState:

i n s t a n c e MonadState ( S t a t e s ) s where get = S t a t e $ λs ( s , s )

put s = S t a t e $ λ ( ( ) , s )

I Aber: manchmalliestman nur, manchmal schreibtman nur. . .

(9)

Die Lesemonade

I Intuition: Werte der Eingabee lesen und verabeiten.

I Lese-Teil der Zustandsmonade

newtype Reader e a = Reader ( e a ) i n s t a n c e Monad ( Reader e ) where

r e t u r n a = Reader $ λe a ( Reader r ) = f = Reader $

λe l e t Reader g = f ( r e ) i n g e

I Eingabe wirdnichtmodifiziert.

I Beispiel: Lesen ausSymboltabelle(Gegenbeispiel: Datei)

(10)

Die Monade Control.Monad.Reader

I Wie vorher: Abstraktion derLeseoperationen

I Neu:LokalerZustand

c l a s s MonadReader e m where ask : : m e

l o c a l : : ( e e ) m a m a i n s t a n c e MonadReader ( Reader e ) where

ask = Reader i d

l o c a l f c = Reader $ λe runReader c ( f e ) a s k s : : ( MonadReader e m) ( e a ) m a a s k s s e l = ask = r e t u r n . s e l

(11)

Die Schreibmonade

I Produziert einen Strom von Werten

I Kein Zugriff auf geschriebene Werte m¨oglich

I Beispiel: “Logging”

newtype W r i t e r w a = W r i t e r ( a , [w ] ) i n s t a n c e Monad ( W r i t e r w) where

r e t u r n a = W r i t e r ( a , [] )

( W r i t e r ( a ,w) ) = f = l e t W r i t e r ( a ’ , w’ ) = f a i n W r i t e r ( a ’ , w++ w’ )

I Abstraktion: auch ¨uberListenvon Ausgabewerten

(12)

Die Monade Control.Monad.Writer

I TypklasseMonoid: Verallgemeinerte Listen

c l a s s ( Monoid w, Monad m) MonadWriter w m where pass : : m ( a , w w) m a

l i s t e n : : m a m ( a , w) t e l l : : w m ( )

i n s t a n c e MonadWriter ( W r i t e r w) where

pass ( W r i t e r ( ( a , f ) ,w) ) = W r i t e r ( a , f w) l i s t e n ( W r i t e r ( a ,w) ) = W r i t e r ( ( a ,w) ,w)

t e l l s = W r i t e r ( ( ) , s )

l i s t e n s : : ( MonadWriter w m)

(w w) m a m ( a ,w) l i s t e n s f m = do ( a ,w) m; r e t u r n ( a , f w) c e n s o r : : ( MonadWriter w m)

(w w) m a m a

(13)

Die Listenmonade

I Listen sind Monaden:

i n s t a n c e Monad [] where m= f = concatMap f m

r e t u r n x = [ x ] f a i l s = []

I Intuition: f :: a [b] Liste der m¨oglichen Resultate

I Reihenfolge der M¨oglichkeiten relevant?

(14)

Der Monade Set

I Data.Setsind Monaden:

i n s t a n c e Monad Set where

m= f = Set . u n i o n s ( Set . map f m) r e t u r n x = Set . s i n g l e t o n x

f a i l s = Set . empty

I Nichtvordefiniert . . .

(15)

Der Continuationmonade

I Auswertungskontext wird explizit modelliert.

newtype Cont r a =

Cont { runCont : : ( ( a r ) r ) }

I rist der Typ der gesamten Berechnung

I a r ist der momentane Kontext

i n s t a n c e Monad ( Cont r ) where r e t u r n a = Cont $ λk k a ( Cont c ) = f = Cont $

λk c (λa runCont ( f a ) k )

(16)

Control.Monad.Cont

I callCC: GOTO f¨ur funktionale Sprachen

c l a s s (Monad m) MonadCont m where c a l l C C : : ( ( a m b ) m a ) m a i n s t a n c e MonadCont ( Cont r ) where

c a l l C C f = Cont $

λk runCont ( f (λa Cont $ λ k a ) ) k

I Liebernichtbenutzen!

(17)

Exkurs: Was ist eigentliche eine Monade?

I Monade: Konstrukt ausKategorientheorie

I Monade=(verallgemeinerter) Monoid

I Monade: gegeben durchalgebraische Theorien

I Operationen endlicher (beschr¨ankter) Aritit¨at

I Gleichungen

I Beispiele:Maybe,List,Set,State, . . .

I Monaden in Haskell:computational monads

I Strukturierte Notation f¨urBerechnungsparadigmen

I Beispiel: Rechner mit Fehler, Nichtdeterminismus, Zustand, . . .

(18)

Kombination von Monaden: Das Problem

I Gegeben zweiMonaden:

c l a s s Monad m1 where . . . c l a s s Monad m2 where . . .

I Es gelten weder

i n s t a n c e Monad (m1 (m2 a ) ) i n s t a n c e Monad (m2 (m1 a ) )

I Problem:Monadengesetze gelten nicht.

I L¨osung:N¨achsteVorlesung

(19)

Zusammenfassung

I Monaden sind praktischeAbstraktion

I Wir haben kennengelernt:

I Fehlermonaden:Maybe,Either,MonadError

I Zustandsmonaden:State,ST,IO

I Lese/Schreibmonade:ReaderMonad,WriterMonad

I Nichtdeterminusmus: [a],Data.Set

I Explizite Spr¨unge:Continuation

I WichtigesStrukturierungsmittelf¨ur funktionale Programme

I Kombination bereitet (noch) Probleme . . .

Referenzen

ÄHNLICHE DOKUMENTE

I Funktionale Sprachen behandeln Zukunftsthemen heute.. Standard ML);. I Continuations (Auswertungskontext

Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 27.10.09:.. Monads — The

I Standard-B¨ ucherei (Monad Template Library) bietet Standard-Monaden als praktischen Bausatz. I

Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 17.11.09:..

I Beispiel f¨ur induktive, aber nicht freie Datenstruktur. I Kompakte Darstellung, effiziente

I Aber: Haskell Standard-IO blockiert nur den aufrufenden Thread.. IORef a). I Entweder leer oder gef¨ullt mit Wert vom

I Problem: Wie aus Socket oder Kanal lesen wenn beide blockieren. I L¨osung:

Im kritischen Abschnitt schlafengehen, wenn Bedingung nicht erf¨ullt (Lock freigeben!)1. Andere Threads machen Bedingung wahr und melden