Fortgeschrittene Techniken der Funktionalen Programmierung Vorlesung vom 05.01.10:
Fancy Types
Christoph L¨uth, Dennis Walter Universit¨at Bremen Wintersemester 2009/10
1
Fahrplan
ITeil I: Monaden und fortgeschrittene Typen ITeil II: Fortgeschrittene Datenstrukturen ITeil III: Nebenl¨aufigkeit
ITeil IV: The Future of Programming
I Fancy Types
I Domain-Specific Languages
I The Next Big Thing: F#, Scala
I R¨uckblick, Ausblick
2
Heute
I“Sexy Types”:
IExistentielleTypen
IObjektorientierung in Haskell?
IPolymorphieH¨ohererOrdnung
ITypentheorie
IEntscheidbarkeitder Typ¨uberpr¨ufung
3
Funktional vs. Objektorientiert
IGemeinsame Konzepte:
I Polymorphie
I Verkapselung(Klassen vs. ADTs/Module)
I Klassenhierarchie
I abstrakte Klassen(interface/class) vs. Instanzen (class/instance)
Inur OO: Zustandsbasiertheit, dynamische Bindung
Inur Funktional: algebraische Typen, Fkt. h¨oherer Ordnung. strengere Typisierung
4
Dynamische Bindung
IJava: Aufl¨osung der Methoden zurLaufzeit:
c l a s s Shape { v o i d draw ( )
{ System . out . p r i n t l n ( ”∗” ) ; }}
c l a s s T r i a n g l e e x t e n d s Shape { v o i d draw ( )
{ System . out . p r i n t l n ( ” /\\” ) ; }}
c l a s s C i r c l e e x t e n d s Shape { v o i d draw ( )
{ System . out . p r i n t l n ( ” ( ) ” ) ; }}
5
Dynamische Bindung
IJava: Aufl¨osung der Methoden zurLaufzeit:
c l a s s t e s t {
p u b l i c s t a t i c v o i d main ( S t r i n g [] a ) { Shape s ;
i f ( a [ 0 ] . e q u a l s ( ” t ” ) ) { s= new T r i a n g l e ( ) ; } e l s e i f ( a [ 0 ] . e q u a l s ( ” s ” ) ) { s= new C i r c l e ( ) ; } e l s e { s=new Shape ( ) ; }
s . draw ( ) ;} }
6
Dynamische Bindung in Haskell?
type Point = ( Double , Double )
c l a s s Shape s where draw : : s→ S t r i n g
draw = ”∗”
data T r i a n g l e = T r i a n g l e Point Point Point i n s t a n c e Shape T r i a n g l e where
draw T r i a n g l e {} = ” /\\” data C i r c l e = C i r c l e Point Double i n s t a n c e Shape C i r c l e where
draw C i r c l e {} = ” ( ) ” ISo nicht . . .
7
Dynamische Bindung in Haskell?
ITyp wird zur¨Ubersetzungszeitberechnet.
I Obwohl erst zurLaufzeitgebunden!
I Implementierung von Klassen durchdictionaries
I Typisierungverdecktdynamische Bindung
IWarumdynamische Bindung?
I Vorteil:Erweiterbarkeiteingebaut
I Nachteil:Erweiterbarkeit nicht immererw¨unscht
8
Existentielle Typen
IIdee aus der Logik:Curry-Howard-Isomorphie
IGetypter Lambda-Kalk¨ul∼=Intuitionistische Pr¨adikatenlogik
IBeweis↔Programm
IAllquantoren(h¨oherer Ordnung)↔Typvariablen
IExistenzquantoren↔ ADTs!
9
Abstract Data Types have Existential Type
IPolymorphie:allquantifizierteTypvariablen
f o r a l l a . data L i s t a = N i l | Cons a ( L i s t a )
ITypkonstruktor f¨ur alle Typen instanzierbar
IADT:existenzquantifizierteTypvariablen data T = f o r a l l a . App a ( a→ I n t )
ITypkonstruktorbeschreibteinenunbestimmten Typ
INB. Nicht mehrHaskell98(nurghc,hugs).
10
Ein einfaches Beispiel
IEinexistenziellerTyp:
data T = f o r a l l a . App a ( a→ I n t ) ap : : T → I n t
ap ( App x f ) = f x IAnwendung:
map ap [ App [ 1 , 2 , 3 ] length , App 3 (5 +) ,
App g e t L i n e (λ → 0 ) ] IN¨utzlich?
IBen¨otigt:Signaturf¨ura
11
Heterogen Listen
ISignaturen im großen:Module
ISignaturen im kleinen:Typklassen
IKlassenf¨urTypvariablen
data S = f o r a l l a . Show a⇒ Cons a ( a→ I n t ) i n s t a n c e Show S where
show ( Cons a ) = show a
12
Dynamische Bindung in Haskell?
IBeispiel:Shapes revisited
c l a s s Shape s where draw : : s→ S t r i n g
draw = ”∗”
IDamit heterogene Listen von Shapes (selbstgemacht) data S h a p e L i s t =
f o r a l l s . Shape s⇒ Cons s S h a p e L i s t
| Empty IObertypallerShapes:
data ShapeT = f o r a l l s . Shape s⇒ Shape s i n s t a n c e Shape ShapeT where
draw ( Shape s ) = draw s
13
Dynamische Bindung in Haskell?
IDreiecke und Kreise:
data T r i a n g l e = T r i a n g l e Point Point Point
i n s t a n c e Shape T r i a n g l e where draw T r i a n g l e {} = ” /\\” data C i r c l e = C i r c l e Point Double
i n s t a n c e Shape C i r c l e where draw C i r c l e {} = ” ( ) ” IDavonunabh¨angigQuadrate:
data Square = Square Point Point
i n s t a n c e Shape Square where draw Square {} = ” []”
IZusammenf¨ugen:
s h a p e l i s t 1 = [ Shape t r i , Shape sq , Shape c i r c l e ] s h a p e l i s t 2 = Cons t r i ( Cons sq ( Cons c i r c l e Empty ) )
s h a p e l i s t 2 ’ = f o l d r (λ ( Shape x ) l→ Cons x l ) Empty s h a p e l i s t 1
14
Dynamische Bindung in Haskell?
IAufl¨osung derBindungzurLaufzeit
IDamit:heterogeneDatenstrukturen
IKeine echteVererbung
IDatentypen m¨ussenerweiterbar angelegtwerden.
15
Polymorphie H¨ oherer Ordnung
INormale Polymorphie: allquantifizierte Typvariablen data f o r a l l a . Maybe a = Nothing | J u s t a fromJust : : f o r a l l a . Maybe a→ a
loop : : f o r a l l a . ( a→ a )→ I n t→ I n t
IAllquantor immeraußen.
IRang-nPolymorphie: Allquantorinnen.
loop : : (f o r a l l a . a→ a )→ I n t→ I n t
IRang 1: allquantifizierte Typvariablen
IRangn+1: Rangnauf derlinkenSeite eines Funktionstyps
16
Erstes Beispiel
IZustands¨ubergangsmonaden, parametrisiert ¨uber Zustands type ST s a = s→ ( a , s )
IDazu: Zustandsbehaftete Berechnung ausf¨uhren runST : : ST s a→ a
IAber: Zustandsichtbar—ah¨angt vonsab.
l e t v = runST ( newRef True ) i n runST ( readVar v ) IAutsch— deshalb:
runST : : f o r a l l a . (f o r a l l s . ST s a )→ a
IAllquantor links∼=Existenzquantor
IZustand kann nicht entkommen,avonsunabh¨angig.
17
Generische Programmierung
IGenerischer Fixpunktoperator:
f o r a l l f . (f o r a l l a . ( a→ a )→
( f a→ f a ) )→ ( F i x f→ F i x f ) IDefiniert wie folgt:
data F i x f = F i x ( f ( F i x f ) ) IMit demKind(∗→∗)→∗
IMonomorphe Typen haben Kind* IPolymorphe Typen haben Kind∗→∗ Ivgl.Konstruktorklassen
c l a s s Monad m where
(=) : : m a→ ( a→ m b )→ m b
18
Modellierung algebraischer Datentypen
IListen alsRang-2Datentyp:
type L i s t a = (f o r a l l l . l→ ( a→ l→ l )→ l )
Ifoldrinstantiiertl
IInitialerMorphismus
IF¨uhrt zurTypentheorie— System F (Girard)
IPolymorphie als Grundkonzept,
Ialg. Datentypen abgeleitet.
N=Y
X.X→(X→X)→X
19
Aufwand der Typ¨ uberpr¨ ufung
IMit existentiellen Typen, Rang-n-Polymorphie etc Typ¨uberpr¨ufungunentscheidbar.
I D.h. Typcheck kanndivergieren!
IAber:wen k¨ummert’s?
IHindley-Milner(Haskell) istexponentiell.
I Kannso gut wiedivergieren
I Beispiel
20
Zusammenfassung
I“Abstract typeshaveexistential type”
I(Limitierte) Modellierung von Objektorientierung
IKeine Vererbung, Erweiterbarkeit IRang-nPolymorphie
IBeispiele:runST, generische Programmierung, . . . ITyp¨uberpr¨ufung wirdunentscheidbar
I. . . aber schon Hindley-Milner-Typcheck ist exponentiell!
IN¨achste Woche:Keine Vorlesung!
IDanach: DSLs (Domain-Specific Languages)
21