• Keine Ergebnisse gefunden

Funktional vs. Objektorientiert

N/A
N/A
Protected

Academic year: 2022

Aktie "Funktional vs. Objektorientiert"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

(2)

Existentielle Typen

IIdee aus der Logik:Curry-Howard-Isomorphie

IGetypter Lambda-Kalk¨ul=Intuitionistische Pr¨adikatenlogik

IBeweisProgramm

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

(3)

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

Referenzen

ÄHNLICHE DOKUMENTE

Christoph Lüth & Dennis Walter Universität Bremen Wintersemester

Christoph Lüth & Dennis Walter Universität Bremen Wintersemester

Christoph Lüth & Dennis Walter Universität Bremen Wintersemester

Christoph L¨ uth, Lutz Schr¨ oder Universit¨ at Bremen Wintersemester

Christoph L¨ uth, Lutz Schr¨ oder Universit¨ at Bremen Wintersemester

Christoph L¨ uth, Lutz Schr¨ oder Universit¨ at Bremen Wintersemester 2009/10.. Das

length (filter p (x:xs)) 2.1... Induktionbasis length

◦ Endliche Mengen: implementiert durch geordnete Listen, Verstecken der Repr¨ asentation n¨ otig f¨ ur Korrektheit. ◦ Relationen und Graphen: Graphalgorithmen durch