Programmieren in Haskell - WS 2011/2012

Werbung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Programmieren in Haskell
Administratives
Listen
WS 2011/2012
DFA
Typpolymorphism
Georg Sauthoff1
Universität Bielefeld
AG Praktische Informatik
November 11, 2011
1
[email protected]
Administratives
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
DFA
Skripte sind nun fertig und gibt es in den Tutorien
Sprechstunden
Typpolymorphism
Zusammenfassung Listen-Kapitel
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Signatur zuerst entwickeln!
was ist die Eingabe/was sind die Eingaben?
was ist die Ausgabe?
Ist Rekursion notwendig?
Wie ist die rekursive Definition der Datenstruktur?
Was sind die Basisfälle?
Welche Art von Rekursion?
Welche Higher-Order-Functions?
Allgemein: Wie sieht die Problemzerlegung aus?
Administratives
Listen
DFA
Typpolymorphism
DFA in Haskell
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
DFA
Typpolymorphism
siehe Tafel
Typpolymorphismus
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
DFA
Typvariablen und Typkontexte in Signaturen
Typklassen
Typpolymorphism
Exkurs: In anderen Sprachen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
Virtual Member Functions
DFA
Typpolymorphism
Funktionenüberladung
Templates
...
Type signatures
Allgemeine Form
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
1
2
expr :: type
expr :: typecontext = > type
type:
Typ-Variable — z.B. a
[type]
()
(type1, ..., typen)
Typekonstruktor, z.B. List a (bzw. List (type))
Int, Integer
type -> type (Function type)
...
Administratives
Listen
DFA
Typpolymorphism
Type signatures
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Allgemeine Form (Deklarationen)
1
2
vars :: type
vars :: typecontext = > type
mit vars = var1 , . . . , varn , n > 0
vari müssen im selben scope definiert sein
Example
1
map :: ( a -> b ) -> [ a ] -> [ b ]
reverse, reverseSlow :: [a] -> [a]
Administratives
Listen
DFA
Typpolymorphism
Typklassen
In Haskell sind Typen in Klassen organisiert. Typen sind dabei
Instanzen von Klassen.
Beispiele für Typklassen
Eq Überprüfung auf Gleichheit. In der Klasse Eq sind die
Operationen == und /= definiert.
Instanzen z.B.: Int, Float, Double, String
Ord Ordnungsrelation. In der Klasse Ord sind die Operationen
<,>,<=,>= definiert.
Instanzen z.B.: Int, Float, Double, String
Num Umfasst die numerischen Typen, z.B. Int, Float, Double
Operationen: +,-,*
Show Werte eines Typs der Instanz der Klasse Show ist, lassen
sich ausgeben
Z.B. Int, Float, Double, String
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
DFA
Typpolymorphism
Vordefinierte Typklassen
Universität Bielefeld
Programmieren
in Haskell
Quelle:
Sauthoff
http://
Administratives
commons.
Listen
wikimedia.
DFA
org/wiki/
Typpolymorphism
File:
Classes.
png, modifizierte
Version
aus dem
Haskell 98
Report
Definition
1
2
3
4
class Classname Typevar where
decl1 :: type11 -> ... -> type1r_m
...
decln :: typen1 -> ... -> type1r_m
5
6
7
8
9
10
11
12
15
16
Programmieren
in Haskell
Sauthoff
Administratives
Listen
DFA
def ault_func_de f1
Typpolymorphism
def ault_func_de f2
...
class Superclass_C on te xt = > Classname Typevar where
decl1 :: type11 -> ... -> type1r_1
...
decln :: typen1 -> ... -> typenr_n
13
14
Universität Bielefeld
def ault_func_de f1
def ault_func_de f2
...
Beispiel: EQ
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
1
2
class Eq a where
(==) , (/=) :: a -> a -> Bool
5
6
DFA
Typpolymorphism
3
4
Listen
-- Minimal complete definition : (==) or (/=)
x == y
= not ( x /= y )
x /= y
= not ( x == y )
Quelle: /usr/lib/hugs/packages/hugsbase/Hugs/Prelude.hs
Beispiel: Ord
1
2
3
4
Universität Bielefeld
c l a s s ( Eq a ) => Ord a where
compare
: : a −> a −> O r d e r i n g
( <) , ( <=) , ( >=) , (>)
: : a −> a −> Bool
max , min
: : a −> a −> a
Programmieren
in Haskell
Sauthoff
Administratives
5
Listen
6
7
8
9
10
−− M i n i m a l c o m p l e t e d e f i n i t i o n : (<=) o r compare
−− u s i n g compare can be more e f f i c i e n t f o r c o m p l e x tDFA
ypes
Typpolymorphism
compare x y | x==y
= EQ
| x<=y
= LT
| o t h e r w i s e = GT
11
12
13
14
15
x
x
x
x
<=
<
>=
>
y
y
y
y
=
=
=
=
compare
compare
compare
compare
=
=
=
=
y
x
x
y
16
17
max x y
18
19
20
min x y
|
|
|
|
x <= y
otherwise
x <= y
otherwise
x
x
x
x
y
y
y
y
/=
==
/=
==
GT
LT
LT
GT
Beispiel: Enum
1
2
3
4
5
6
7
8
c l a s s Enum a where
succ , pred
toEnum
fromEnum
enumFrom
enumFromThen
enumFromTo
enumFromThenTo
Universität Bielefeld
Programmieren
in Haskell
::
::
::
::
::
::
::
a −> a
I n t −> a
a −> I n t
a −> [ a ]
a −> a −> [ a ]
a −> a −> [ a ]
a −> a −> a −> [ a ]
Sauthoff
Administratives
−−
−−
−−
−−
Listen
[n ..]
DFA
[ n ,m . . ]
[ n .Typpolymorphism
. m]
[ n , n ’ . . m]
9
10
11
12
13
14
15
16
−− M i n i m a l c o m p l e t e d e f i n i t i o n : toEnum , fromEnum
succ
= toEnum . (1+)
. fromEnum
pred
= toEnum . s u b t r a c t 1 . fromEnum
enumFrom x
= map toEnum [ fromEnum x . . ]
enumFromTo x y
= map toEnum [ fromEnum x . . fromEnum
enumFromThen x y
= map toEnum [ fromEnum x , fromEnum y
enumFromThenTo x y z = map toEnum [ fromEnum x , fromEnum y
Quelle: /usr/lib/hugs/packages/hugsbase/Hugs/Prelude.hs
Instanz
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
1
2
3
4
5
6
7
8
instance Classname Type where
def1
...
defn
instance Context = > Classname Type where
def1
...
defn
Administratives
Listen
DFA
Typpolymorphism
Beispiel (Prelude)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
1
2
instance Eq Char
c == c ’
where
DFA
= fromEnum c == fromEnum
c’
Typpolymorphism
3
4
5
instance Ord Char
c <= c ’
Quelle: Haskell Report
where
= fromEnum c <= fromEnum c ’
Derived Instances
Universität Bielefeld
Bei der Declaration von einem Algebraischen Datentyp können
mit deriving Instanzen automatisch erzeugt werden:
Programmieren
in Haskell
Sauthoff
Administratives
Definition
Listen
DFA
Typpolymorphism
data T a1 . . . am = C1 t11 . . . t1n1
...
Cr tr 1 . . . trnr
deriving (k1 , . . . , ku )
aus der Prelude geht das für:
Eq, Ord, Enum, Show, . . .
|
|
Derived Instances
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Listen
wenn eine Typklasse eine Superklasse hat, muss der
Datentyp schon Mitglied dieser Instanz sein
aber die automatische Instanziierung erfüllt nicht immer
DWIM
DFA
Typpolymorphism
Beispiel
Universität Bielefeld
Programmieren
in Haskell
data Temperatur = Temp Float Einheit
deriving ( Eq , Show )
Sauthoff
Administratives
Listen
Wegen deriving Eq können wir nun automatisch
Temperaturen vergleichen:
DFA
Typpolymorphism
Temp 506 Kelvin == Temp 506 Kelvin -- = > True
Aber:
Temp 506 Kelvin == conv ( Temp 506 Kelvin )
Fahrenheit
-- = > False
Wiederholung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
1
2
3
4
5
6
conv :: Temperatur -> Einheit -> Temperatur
conv ( Temp t Celsius ) Kelvin
=
Temp ( t + 273.15) Kelvin
conv ( Temp t Kelvin ) Fahrenheit =
Temp ( t *9/5 -459.67) Fahrenheit
...
Listen
DFA
Typpolymorphism
Eigene Instanz
Universität Bielefeld
Programmieren
in Haskell
1
2
data Temperatur = Temp Float Einheit
deriving Show
Sauthoff
Administratives
Listen
3
4
5
6
7
8
9
10
11
12
instance Eq Temperatur where
( Temp t Celsius )
== ( Temp u Celsius )
= t == u
( Temp t Fahrenheit ) == ( Temp u Fahrenheit )
= t == u
( Temp t Kelvin )
== ( Temp u Kelvin )
= t == u
( Temp t Kelvin )
== ( Temp u Fahrenheit )
= conv ( Temp t Kelvin ) Fahrenheit
== Temp u Fahrenheit
DFA
Typpolymorphism
Herunterladen