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