• Keine Ergebnisse gefunden

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 06.11.2018: Typvariablen und Polymorphie

N/A
N/A
Protected

Academic year: 2022

Aktie "Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 06.11.2018: Typvariablen und Polymorphie"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 06.11.2018: Typvariablen und Polymorphie

Christoph Lüth Universität Bremen Wintersemester 2018/19

16:03:04 2018-12-18 1 [31]

Fahrplan

I Teil I: Funktionale Programmierung im Kleinen

IEinführung

IFunktionen

IAlgebraische Datentypen

I Typvariablen und Polymorphie

IZyklische Datenstrukturen

IFunktionen höherer Ordnung I

IFunktionen höherer Ordnung II

I Teil II: Funktionale Programmierung im Großen I Teil III: Funktionale Programmierung im richtigen Leben

PI3 WS 18/19 2 [31]

Inhalt

I Letzte Vorlesungen: algebraische Datentypen

I Diese Vorlesung:

I Abstraktionüber Typen:TypvariablenundPolymorphie

I Arten der Polymorphie:

I Parametrische Polymorphie

I Ad-hoc Polymorphie

PI3 WS 18/19 3 [31]

Ähnliche Datentypen der letzten Vorlesung

dataLager = LeeresLager

| Lager A r t i k e l Menge Lager dataEinkaufswagen = LeererWagen

| Einkauf A r t i k e l Menge Einkaufswagen data String = Empty

| Char : + String I einkonstanterKonstruktor

I einlinear rekursiverKonstruktor

PI3 WS 18/19 4 [31]

Ähnliche Funktionen der letzten Vorlesung

kasse :: Einkaufswagen→ Int kasse LeererWagen = 0

kasse ( Einkauf a m e) = cent a m+ kasse e inventur :: Lager→ Int

inventur LeeresLager = 0

inventur (Lager a m l ) = cent a m+ inventur l length :: String→ Int

length Empty = 0

length (c : + s ) = 1+ length s I ein Fall pro Konstruktor I linearerrekursiver Aufruf

PI3 WS 18/19 5 [31]

Die Lösung: Polymorphie

Definition (Polymorphie)

Polymorphie istAbstraktion über Typen

Arten der Polymorphie

I ParametrischePolymorphie (Typvariablen):

Generisch überalleTypen I Ad-HocPolymorphie (Überladung):

Nur fürbestimmteTypen

Anders als in Java (mehr dazu später).

PI3 WS 18/19 6 [31]

Parametrische Polymorphie

PI3 WS 18/19 7 [31]

Parametrische Polymorphie: Typvariablen

I Typvariablenabstrahieren über Typen data L i s t α= Empty

| Consα( L i s t α)

I αist eineTypvariable

I List αist einpolymorpherDatentyp I Signaturder Konstruktoren

Empty :: L i s t α

Cons :: α→ L i s tα→ L i s t α

I Typvariableαwird beiAnwendunginstantiiert

PI3 WS 18/19 8 [31]

(2)

Polymorphe Ausdrücke

I TypkorrekteTerme: Typ

Empty L i s t α

Cons 57 Empty L i s t Int

Cons 7 (Cons 8 Empty) L i s t Int

Cons ’p ’ (Cons ’ i ’ (Cons ’3 ’ Empty)) L i s t Char

Cons True Empty L i s t Bool

I Nichttyp-korrekt:

Cons ’a ’ (Cons 0 Empty) Cons True (Cons ’x ’ Empty) wegenSignaturdes Konstruktors:

Cons :: α→ L i s tα→ L i s t α

PI3 WS 18/19 9 [31]

Polymorphe Funktionen

I Parametrische Polymorphie fürFunktionen:

(++) :: L i s tα→ L i s tα→ L i s t α Empty ++ t = t

(Cons c s ) ++ t = Cons c ( s++ t )

ITypvariablevergleichbar mit Funktionsparameter I Typvariableαwird bei Anwendung instantiiert:

Cons 3 Empty ++ Cons 5 (Cons 57 Empty) Cons ’p ’ (Cons ’ i ’ Empty) ++ Cons ’3 ’ Empty abernicht

Cons True Empty ++ Cons ’a ’ (Cons ’b ’ Empty)

PI3 WS 18/19 10 [31]

Beispiel: Der Shop (refaktoriert)

I EinkaufswagenundLagerals Listen?

I Problem:zweiTypen als Argument I Lösung: zu einem Typ zusammenfassen

data Posten = Posten A r t i k e l Menge I Damit:

type Lager = [ Posten ] type Einkaufswagen = [ Posten ] I GleicherTyp!

I Bug or Feature? Bug!

I Lösung: Datentypverkapseln data Lager = Lager [ Posten ] data Einkaufswagen = Ekwg [ Posten ]

PI3 WS 18/19 11 [31]

Tupel

I Mehr alseineTypvariable möglich I Beispiel:Tupel(kartesisches Produkt, Paare)

data Pairα β= Pair { l e f t :: α, r i g h t :: β} I Signatur Konstruktor und Selektoren:

Pair :: α→β→ Pairα β l e f t :: Pair α βα r i g h t :: Pairα ββ

I Beispielterm Typ

Pair 4 ’x ’ Pair Int Char

Pair (Cons True Empty) ’a ’ Pair ( L i s t Bool) Char Pair (3+ 4) Empty Pair Int ( L i s tα) Cons ( Pair 7 ’x ’ ) Empty L i s t ( Pair Int Char)

PI3 WS 18/19 12 [31]

Vordefinierte Datentypen

PI3 WS 18/19 13 [31]

Vordefinierte Datentypen: Tupel und Listen

I Eingebautersyntaktischer Zucker I Listen

data [α] = [ ] |α : [α]

IWeitereAbkürzungen:

Listenliterale:[ x ]fürx : [ ],[ x , y ]fürx : y : [ ]etc.

Aufzählungen:[ n . . m]und[ n , m . . k ]füraufzählbareTypen I Tupelsind das kartesische Produkt

data (α,β) = ( f s t :: α, snd :: β)

I (a , b)=alle Kombinationenvon Werten ausaundb

IAuch n-Tupel:(a , b , c)etc. (aber ohne Selektoren)

I0-Tupel:()(unit type, Typ mit genau einem Element)

PI3 WS 18/19 14 [31]

Vordefinierte Datentypen: Optionen

I Existierende Typen:

data Preis = Cent Int | Ungueltig

data Resultat = Gefunden Menge | NichtGefunden I Instanzen einesvordefiniertenTypen:

dataMaybeα= Nothing | Justα

I Vordefinierten Funktionen (import Data .Maybe):

fromJust :: Maybeαα −−partiell fromMaybe :: α→Maybeα→α

listToMaybe :: [α]→Maybeα −−totale Variante von head maybeToList :: Maybeα→ [α] −−rechtsinvers zu listToMaybe I Es gilt: listToMaybe (maybeToList m) = m

length l≤1 =⇒ maybeToList (listToMaybe l ) = l

PI3 WS 18/19 15 [31]

Übersicht: vordefinierte Funktionen auf Listen I

(++) :: [α]→ [α]→ [α] −−Verketten

( ! ! ) :: [α]→ Int→α −−n-tes Element selektieren concat :: [ [α] ]→ [α] −−“flachklopfen”

length :: [α]→ Int −−Länge

head , l a s t :: [α]→α −−Erstes/letztes Element t a i l , i n i t :: [α]→ [α] −−Hinterer/vorderer Rest r e p l i c a t e :: Int→α→ [α] −−ErzeugenKopien

repeat :: α→ [α] −−Erzeugt zyklische Liste

take :: Int→ [α]→ [α] −−ErstenElemente drop :: Int→ [α]→ [α] −−Rest nachnElementen s p l i t A t :: Int→ [α]→ ( [α] , [α] ) −−Spaltet an Indexn

reverse :: [α]→ [α] −−Dreht Liste um

zip :: [α]→ [β]→ [ (α, β) ] −−Erzeugt Liste von Paaren unzip :: [ (α,β) ]→ ( [α] , [β] ) −−Spaltet Liste von Paaren and , or :: [ Bool ]→ Bool −−Konjunktion/Disjunktion

sum :: [ Int ]→ Int −−Summe (überladen)

PI3 WS 18/19 16 [31]

(3)

Vordefinierte Datentypen: Zeichenketten

I Stringsind Listen von Zeichen:

type String = [ Char ]

I Alle vordefiniertenFunktionen auf Listenverfügbar.

I Syntaktischer Zuckerfür Stringliterale:

"yoho" == [ ’ y ’ , ’ o ’ , ’ h ’ , ’ o ’ ] == ’y ’ : ’ o ’ : ’ h ’ : ’ o ’ : [ ] I Beispiele:

"abc" ! ! 1 ’b ’ reverse "oof" "foo"

[ ’ a ’ , ’ c ’ . . ’ z ’ ] "acegikmoqsuwy"

s p l i t A t 10 " Praktische␣Informatik "

( " Praktische " , "␣Informatik " )

PI3 WS 18/19 17 [31]

Typherleitung

PI3 WS 18/19 18 [31]

Typen in Haskell (The Story So Far)

I Primitive Basisdatentypen: Bool,Double

I Funktionstypen Double→ Int→ Int,[ Char ] → Double

I Typkonstruktoren: [ ],(. . .),Foo

I Typvariablen f s t :: (α, β)α

length :: [α] → Int (++) :: [α] → [α] → [α]

I Typklassen : elem :: Eq a⇒ a → [ a ] → Bool

max :: Ord a⇒a →a → a

PI3 WS 18/19 19 [31]

Typinferenz: Das Problem

I Gegeben Definition vonf: f m xs = m + length xs I Frage: welchen Typ hatf?

IUnterfrage: ist die angegebene Typsignatur korrekt?

I InformelleAbleitung

f m xs = m + length xs

[α]→ Int [α]

Int Int

Int f :: Int→ [α]→ Int

PI3 WS 18/19 20 [31]

Typinferenz (nach Hindley-Milner)

I Typinferenz:Herleitungdes Typen eines Ausdrucks I Für bekannte Bezeichner wird Typ eingesetzt I Für Variablen wird allgemeinster Typ angenommen I Bei der Funktionsanwendung wirdunifiziert:

f m xs = m + length xs

α [β]→ Int γ

[β] γ7→[β]

Int Int→ Int→ Int

Int α7→Int

Int→ Int Int f :: Int→ [β]→ Int

PI3 WS 18/19 21 [31]

Typinferenz

Theorem (Entscheidbarkeit der Typinferenz)

Die Typinferenz istentscheidbar, und findet immer denallgemeinsten Typ, wenn er existiert.

I Entscheidbarkeit ist nicht alles.

I Grundsätzliche Komplexität istDEXPTIME(n) (deterministisch exponentiell), aber in der Praxis ist dasnieein Problem.

PI3 WS 18/19 22 [31]

Typinferenz

I Unifikation kannmehrere Substituitionenbeinhalten:

f x y = (x , 3) : ( ’ f ’ , y) : [ ]

α Int Char β [γ]

(α, Int ) (Char , β)

[ ( Char , β) ] γ7→(Char , β) [ ( Char , Int ) ] β7→Int, α7→Char f :: Char→ Int→ [ ( Char , Int ) ]

I Allgemeinster Typmuss nichtexistieren (Typfehler!)

I Bsp: [ True ] ++ [ 3 ] ,x : x

PI3 WS 18/19 23 [31]

Ad-Hoc Polymorphie

PI3 WS 18/19 24 [31]

(4)

Ad-Hoc Polymorphie und Overloading

Definition (Überladung)

Funktionf :: a→bexistiert fürmehr als einen, abernichtfüralle Typen

I Beispiel:

I Gleichheit:(==) :: α→α→ Bool

I Vergleich:(≤) :: α→α→Bool

I Anzeige:show :: α→String I Lösung:Typklassen I Typklassen bestehen aus:

I Deklarationder Typklasse

I Instantiierungfür bestimmte Typen

PI3 WS 18/19 25 [31]

Typklassen: Syntax

I Deklaration:

class Showαwhere show :: α→ String I Instantiierung:

instanceShow Boolwhere show True = "Wahr"

show False = "Falsch"

I Prominente vordefinierte Typklassen

IEqfür(==)

IOrdfür(≤)(und andere Vergleiche)

IShowfürshow

INum(uvm) für numerische Operationen (Literale überladen)

PI3 WS 18/19 26 [31]

Typklassen in polymorphen Funktionen

I Element einer Liste (vordefiniert):

elem :: Eqαα→ [α]→ Bool elem e [ ] = False

elem e (x : xs ) = e == x | | elem e xs

I Sortierung einer List:qsort qsort :: Ordα⇒ [α]→ [α]

I Liste ordnen und anzeigen:

showsorted :: (Ordα, Showα)⇒ [α]→ String showsorted x = show ( qsort x)

PI3 WS 18/19 27 [31]

Hierarchien von Typklassen

I Typklassen können anderevoraussetzen:

class Eqα⇒ Ordαwhere (<) :: α→α→ Bool (≤) :: α→α→ Bool a<b = a≤b && a6= b

I Default-Definition von(<)

I Kann bei Instantiierung überschrieben werden

PI3 WS 18/19 28 [31]

Abschließende Bemerkungen

PI3 WS 18/19 29 [31]

Polymorphie: the missing link

Parametrisch Ad-Hoc

Funktionen f :: α→Int class Fαwhere

f :: a→Int

Typen dataMaybeα=

Just α| Nothing

Konstruktorklassen

I KannEntscheidbarkeitder Typherleitung gefährden

PI3 WS 18/19 30 [31]

Zusammenfassung

I Abstraktionüber Typen

I UniformeAbstraktion: Typvariable, parametrische Polymorphie

I FallbasierteAbstraktion: Überladung, ad-hoc-Polymorphie I In der Sprache Haskell:TypvariablenundTypklassen I WichtigevordefinierteTypen:

I Listen[α]

I OptionenMaybeα

I Tupel(α,β)

PI3 WS 18/19 31 [31]

Referenzen

ÄHNLICHE DOKUMENTE

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom 06.01.2015: Aktionen und Zustände..

I polymorphe Funktionen und Datentypen I Vordefinierte Typen: Listen [a] und Tupel (a,b) I Nächste Woche: Abstraktion über Funktionen. Funktionen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom 08.01.2013: Aktionen und Zustände..

I Tutorien: Mo 10-12 MZH 5210 Christian Maeder Mo 16-18 MZH 1380 Rene Wagner Di 8-10 MZH 1100 Diedrich Wolter Di 10-12 MZH 1380 Diedrich Wolter Di 10-12 MZH 1400 Bernd Gersdorf Di

werden gleichzeitig definiert (Rekursion!) I Namen f, y und Parameter (x) überlagern andere I Es gilt die Abseitsregel. I Deshalb: Auf gleiche Einrückung der lokalen

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

I Überladung: Funktion f :: a→ b existiert für einige, aber nicht für alle Typen.

I Eigenschaften von Werten des Typen (insb. ihre innere Struktur) können nur über die bereitgestellten Operationen beobachtet werden. Zur Implementation von ADTs in