• Keine Ergebnisse gefunden

Monaden als Berechngsmuster

N/A
N/A
Protected

Academic year: 2022

Aktie "Monaden als Berechngsmuster"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Reaktive Programmierung

Vorlesung 2 vom 09.04.2017: Monaden als Berechnungsmuster

Christoph Lüth, Martin Ring Universität Bremen Sommersemester 2017

22:56:58 2017-06-06 1 [28]

Fahrplan

I Einführung

I Monaden als Berechnungsmuster I Nebenläufigkeit: Futures and Promises I Aktoren I: Grundlagen

I Aktoren II: Implementation I Bidirektionale Programmierung I Meta-Programmierung I Reaktive Ströme I I Reaktive Ströme II

I Functional Reactive Programming I Software Transactional Memory I Eventual Consistency I Robustheit und Entwurfsmuster I Theorie der Nebenläufigkeit, Abschluss

RP SS 2017 2 [28]

Inhalt

I Monaden als allgemeine Berechnungsmuster

I Beispielmonaden, und wie geht das mitIO?

I Monaden in Scala

RP SS 2017 3 [28]

Monaden als allgemeine Berechnungsmuster

RP SS 2017 4 [28]

Berechnungsmuster

I Eine Programmiersprache hat ein grundlegendesBerechnungsmodell und darüber hinausSeiteneffekte

I Seiteneffekte sind meistimplizit(Bsp: exceptions)

I MonadenverkapselnSeiteneffekt in einemTypmit bestimmten Operationen:

1.Kompositionvon Seiteneffekten 2.LeereSeiteneffekte

3.Basisoperationen

I Idee: Seiteneffektexplizitmachen

RP SS 2017 5 [28]

Monaden als Berechngsmuster

EineMonadeist:

I mathematisch: durch Operationen und Gleichungen definiert (verallgemeinerte algebraische Theorie)

I als Berechnungsmuster:verknüpfbareBerechnungen mit einem Ergebnis

I InHaskell: durch mehrereTypklassendefinierte Operationen mit bestimmten Eigenschaften

I InScala:ein Typ mit bestimmtenOperationen

RP SS 2017 6 [28]

Beispiel: Funktionen mit Zustand

I Funktionf :ABmit Seiteneffekt inZustandS:

f :A×SB×S ∼= f0:ASB×S I Datentyp:SB×S

I Operationen:

I Komposition von zustandsabhängigen Berechnungen:

f:A×SB×S

∼= f0:ASB×S

g:B×SC×S

∼= g0:BSC×S g0.f0= (g.f)0

I Basisoperationen: aus dem Zustandlesen, Zustandverändern

RP SS 2017 7 [28]

Monaden in Haskell

RP SS 2017 8 [28]

(2)

Monaden in Haskell

I Monaden in Haskell als Verallgemeinerung von Aktionen Aktionen:

typeIOα Komposition:

(=) :: IOα→(α→IOβ)→IOβ Leere Aktion:

return :: α→IOα Aktion für Funktionen:

fmap :: (α→β)→IOα→IOβ

Monadem:

typemα Komposition:

(>>) :: mα→ (α→mβ)→mβ Leerer Seiteneffekt:

return :: α→mα Seiteneffekt auf Funktionen:

fmap :: (α→β)→mα→mβ

Beispiel für eine Konstruktorklasse.

RP SS 2017 9 [28]

Monadengesetze I

I Monaden müssen bestimmte Eigenschaften erfüllen.

I Für Funktionen:

class Functor f where

fmap :: (α→β) → f α→ f β

fmapbewahrt Identität und Komposition:

fmap id == id

fmap ( f◦g) == fmap f◦fmap g

I Folgendes gilt allgemein (fürr :: f α→ gα,h :: α→β):

fmap h◦r == r◦fmap h

RP SS 2017 10 [28]

Monadengesetze II

I Für Verkettung (=) und Lifting (return):

class (Functor m, Applicative m)=>Monad mwhere (=) :: mα→ (α→mβ) →mβ

return :: α→mα

=ist assoziativ undreturndas neutrale Element:

return a= k == k a m= return == m

m= (x →k x= h) == (m= k)= h

I Folgendes gilt allgemein (naturalityvonreturnund=):

fmap f◦return == return◦f m= (fmap f◦p) == fmap f (m= p)

I Den syntaktischen Zucker (do-Notation) gibt’s dann umsonst dazu.

RP SS 2017 11 [28]

Zustandsabhängige Berechnungen in Haskell

I Modellierung: Zuständeexplizitin Typσ(polymorph überα) dataSTσ α= St { run :: σ→ (α,σ) }

I Komposition zweier solcher Berechnungen:

f= g = St $ λslet (a , s ’ )= run f s in run (g a) s ’

I Leerer Seiteneffekt:

return a = St $ λs→ (a , s )

I Lifting von Funktionen:

fmap f g = St $ λs→ let (a , s1 )= run g s in ( f a , s1 )

RP SS 2017 12 [28]

Basisoperationen: Zugriff auf den Zustand

I Zustand lesen:

get :: (σ→α)→STσ α get f = St $λs→ ( f s , s )

I Zustand setzen:

set :: (σ→σ)→STσ () set g = St $λs→ (() , g s )

RP SS 2017 13 [28]

Benutzung von ST: einfaches Beispiel

I Zähler als Zustand:

typeWithCounterα= ST Int α

I Beispiel: Funktion, die in Kleinbuchstaben konvertiert undzählt:

cntToL :: String→ WithCounter String cntToL [ ] = return ""

cntToL (x : xs )

| isUpper x = do ys←cntToL xs set (+1)

return (toLower x : ys )

| otherwise = do{ ys←cntToL xs ; return (x : ys ) }

I Hauptfunktion:

cntToLower :: String→ ( String , Int ) cntToLower s = run (cntToL s ) 0

RP SS 2017 14 [28]

Implizite vs. explizite Zustände

I Nachteil vonST: Zustand istexplizit

I Kanndupliziertwerden

I Daher: Zustandimplizitmachen

I Datentypverkapseln

I Zugriff auf Zustandnurüber elementare Operationen

I Zustand wird garantiert nicht dupliziert oder weggeworfen.

RP SS 2017 15 [28]

Zustandstransformer mit impliziten Zustand

I Impliziter Zustand und getypte Referenzen:

newtype Refα= Ref { addr :: Integer } deriving (Eq, Ord) typeMemα= M.Map Integer α

I Lesen und Schreiben als Operationen aufData .Map I Impliziten Zustand und Basisoperationen verkapseln:

newtypeSTα β= ST { state :: State .ST (Memα) β }

I Exportschnittstelle:statewirdnicht exportiert IrunSTKombinator:

runST :: STα β→β

runST s = f s t ( State . run ( state s ) M. empty)

I Mit dynamischen Typen können wir den Zustand monomorph machen.

RP SS 2017 16 [28]

(3)

Weitere Beispiele für Monaden

I Zustandstransformer:State,ST,Reader,Writer

I Fehler und Ausnahmen:Maybe,Either

I Mehrdeutige Berechnungen:L i s t,Set

RP SS 2017 17 [28]

Unveränderliche Zustände: Reader

I Die Reader-Monade:

newtype Readerσ α= Rd { run :: σα}

instance Functor (Readerσ) where fmap f r = Rd ( f . run r )

instanceMonad (Readerσ) where return a = Rd (λs→a)

r= f = Rd (λs→ run ( f (( run r ) s ) ) s )

I Berechnungsmodell: Zustand aus dem nurgelesenwird

IVereinfachter Zustandsmonade

IBasisoperation:read,l o c a l

IEs gibt auch das “Gegenstück”:Writer

RP SS 2017 18 [28]

Fehler und Ausnahmen: Maybe

I Maybeals Monade:

instance Functor Maybewhere fmap f ( Just a) = Just ( f a) fmap f Nothing = Nothing

instance Monad Maybewhere Just a= g = g a Nothing= g = Nothing return = Just

I Berechnungsmodell:Fehler

I f :: α→Maybeβist Berechnung mit möglichem Fehler

I Fehlerfreie Berechnungen werden verkettet

I Fehler (Nothing) werden propagiert

RP SS 2017 19 [28]

Fehler und Ausnahmen: Either

I Either αals Monade:

dataEither δ β= Left δ | Rightβ

instance Functor ( Either δ)where fmap f ( Right b) = Right ( f b) fmap f ( Left a) = Left a

instanceMonad ( Either δ)where Right b= g = g b

Left a = _ = Left a return = Right

I Berechnungsmodell:Ausnahmen

I f :: α→Either δ βist Berechnung mit Ausnahmen vom Typδ

IAusnahmefreie Berechnungen (Right a) werden verkettet

IAusnahmen (Left e) werden propagiert

RP SS 2017 20 [28]

Mehrdeutigkeit

I L i s tals Monade:

I Können wir so nicht hinschreiben, Syntax vordefiniert

I Aber sieheListMonad.hs instance Functor [α] where

fmap = map

instance Monad [α] where a : as= g = g a ++ ( as= g)

[ ]= g = [ ] return a = [ a ]

I Berechnungsmodell: Mehrdeutigkeit

I f :: α→ [β]ist Berechnung mitmehrerenmöglichen Ergebnissen

I Verkettung: Anwendung der folgenden Funktion aufjedesErgebnis (concatMap)

RP SS 2017 21 [28]

Aktionen als Zustandstransformationen

I Idee: Aktionen sindZustandstransformationenauf SystemzustandS I Sbeinhaltet

ISpeicher als AbbildungA*V(AdressenA, WerteV)

IZustand des Dateisystems

IZustand des Zufallsgenerators I In Haskell: TypRealWorld

I“Virtueller” Typ, Zugriff nur über elementare Operationen

IEntscheidend nurReihenfolgeder Aktionen typeIOα= ST RealWorldα

RP SS 2017 22 [28]

Monaden in Scala

RP SS 2017 23 [28]

Monaden in Scala

I Seiteneffekte sind in Scala implizit

I Aber Monaden werden implizit unterstützt

I “Monadische” Notation:for

RP SS 2017 24 [28]

(4)

Monaden in Scala

I Für eine Monade in Scala:

abstract classT[A] {

def flatMap [B] ( f : A⇒ T[B] ) : T[B]

defmap[B] ( f : A⇒ B) : T[B]

}

I Gegebenfalls noch

def f i l t e r ( f : A⇒ Bool) : T[A]

def foreach ( f : A⇒ Unit ) : Unit

RP SS 2017 25 [28]

do it in Scala!

I Übersetzung vonf ormit einem Generator:

for (x← e1) yield r =⇒ e1 .map(x⇒ r )

I formit mehreren Generatoren:

for (x1← e1 ; x2← e2 ; s ) yield r

=⇒

e1 . flatMap(x⇒ for (y← e2 ; s ) yield r )

I Wo ist dasreturn? Implizit:

e1 .map(x⇒ r ) == e1 . flatMap(x⇒ return r ) fmap f p == p= return◦f

RP SS 2017 26 [28]

Beispiel: Zustandsmonade in Scala

I Typ mitmapundflatMap:

case class State [S,A] ( run : S⇒ (A,S) ) {

def flatMap [B] ( f : A⇒ State [S,B] ) : State [S,B] = State { s⇒ val (a , s2 ) = run( s )

f (a) . run( s2 ) }

defmap[B] ( f : A⇒B) : State [S,B] = flatMap(a⇒ State ( s⇒ ( f (a) , s ) ) )

I Beispielprogramm: Ein Stack

RP SS 2017 27 [28]

Zusammenfassung

I Monaden sindMusterfürBerechnungenmitSeiteneffekten I Beispiele:

IZustandstransformer

IFehler und Ausnahmen

INichtdeterminismus

I Nutzen von Monade: Seiteneffekteexplizitmachen, und damit Programmerobuster

I Was wir ausgelassen haben: Kombination von Monaden (Monadentransformer)

I Grenze: Nebenläufigkeit−→Nächste Vorlesung

RP SS 2017 28 [28]

Referenzen

ÄHNLICHE DOKUMENTE

FDR), um solche Deadlocks in Spezifikationen zu finden.

klmem ; Sc llli lervaci ar^' periculiserepu »ciekita exolvioaug voca. III» enim tervire pium, illi vora exolvere urile t>!eminL cerce fraucli suie illi servire illi odeclire!

ober ~öd)ftena in feinem lYriebrid) ~U~elm TI. 3el;}t fommt ea barauf an, jene beiben ffiid)tungen au einer einaigen ~ö~mn au berfd)melaen; alfo baß im beften ~inne beforattbe

ID1an ljat f 0 lange gefragt, maß bn\'S beutfd)e lBntedanb ift, biß bie ®efd)icJ?te barauf eine mntmort gab; man loUte nun einmal fragen, l1)a\'S unb mo bet beutfd)e @eift ift, um

@50 ift aud} eine rein ~iftorifcge, rüdltlärtß geltlenbete 58etrad}tung ber geiftigen l,ßerfönHd}feit 9?emllranbt'ß Itlie feineß ~olfetl 31tlar niel}t u>ert~lotl i aber fie

@50 ift aud} eine rein ~iftorifcge, rüdltlärtß geltlenbete 58etrad}tung ber geiftigen l,ßerfönHd}feit 9?emllranbt'ß Itlie feineß ~olfetl 31tlar niel}t u>ert~lotl i aber fie

• IBM PC/XT compatible keyboard, monochrome adaptor card and monochrome monitor.. • IBM PC/XT compatible keyboard, color adaptor card and color

Gesucht ist ein vierter Kreis k, der aus den drei Kreisen Sehnen der gegebenen Stre- ckenlänge s herausschneidet.. Die Aufgabe ist mit Zirkel und