Listenkomprehension und Typenklassen anhand von Haskell

26
Listenkomprehension und Typenklassen anhand von Haskell Proseminar an der TU München Martin Levihn 05.07.2007

description

Listenkomprehension und Typenklassen anhand von Haskell. Proseminar an der TU München Martin Levihn 05.07.2007. Gliederung. Listenkomprehension Einleitung und Motivation Syntax Beispiele und Arbeitsweise mit einem Generator Beispiele und Arbeitsweise mit mehreren Generatoren - PowerPoint PPT Presentation

Transcript of Listenkomprehension und Typenklassen anhand von Haskell

Listenkomprehnsion und Typenklassen an hand von Haskell

Listenkomprehension und Typenklassen anhand von HaskellProseminar an der TU MnchenMartin Levihn05.07.2007

GliederungListenkomprehensionEinleitung und MotivationSyntaxBeispiele und Arbeitsweise mit einem GeneratorBeispiele und Arbeitsweise mit mehreren Generatorenbersetzung von ListenkomprehensionTypklassenBegriffserklrung und EinleitungDeklarationenKlassendeklarationKontext eines TypsInstanzen deklarierenAbgeleitete KlassenPraktische AnwendungVergleich zu OOP2ListenkomprehensionListenkomprehension hnlich Mengenbeschreibung in der Mathematik Erstelle Liste als Beschreibung in Bezug auf eine andere Liste[ x | x [a] -> [b] Funktion rekursivmap f [] = []map f (x:xs) = f x : map f xsmit Listkomprehensionmap f xs = [ f x | x Bool) -> [a] -> [a] Funktion rekursivfilter p [] = []filter p (x:xs) = | p x = x : filter p xs|otherwise = filter p xs mit Listkomprehensionfilter p xs = [ x | x [(a, b)]pairs xs ys= [ (x,y)| x a -> a -> BoolallEqual m n p = (m==n) && (n==p)Bereich vor dem => heit KontextWenn der Typ a in der Kasse Eq ist, dann hat allEqual den Typ a -> a -> a -> Bool.

15Kontext eines TypsListe aus Tupeln soll auf dem ersten Wert sortiert werden und die zweiten Werte sollen ausgegeben werden.Hakell Prelude bietet Klasse Ord, definiert Vergleichsoperatoren,sowie Visible:class Visible a wheretoString :: a -> Stringsize :: a -> Int

16Kontext eines Typsgeforderte Funktionalitt durch Kontext sichergestellt:

bSort :: (Ord a, Visible b) => [(a, b)] -> a -> String

Verletzen der constraints : nachfolger :: Int -> Int nachfolger = (+1)

Aufruf allEqual nachfolger nachfolger nachfolger ERROR: Int -> Int is not an instance of class Eq17Instanz einer Klasse Um einen Typ als Instanz einer Typklasse zu deklarieren, mssen die in der Signatur geforderten Funktionen implementiert werdenBeispiel Bool als Instanz von Eq deklarieren: instance Eq Bool where True==True = True False==False = True _ == _ = False

18Instanz einer Klasse Gleichheitstest auf Listen definieren

instance Eq [a] where[] == [] = Truex:xs == y:ys = x==y && xs==ys_ == _ = False

Ist == definiert?19Instanz einer Klasse Gleichheitstest nur auf Liste definiert, deren Elemente selbst Instanzen von Eq sind

instance Eq a => Eq [a] where[] == [] = Truex:xs == y:ys = x==y && xs==ys_ == _ = False

knnen == als gegeben voraussetzen

20Abgeleitete KlassenEine Art Vererbungclass Eq a => Ord a where(=) :: a -> a -> Boolmax, min :: a -> a -> Boolcompare :: a -> a -> Orderingx y = y < xEine Abgeleitete Klasse kann ebenfalls mehrere Basisklassen haben class (Num a, Ord a) => Real a where...

2121Praktische Anwendungdata Tag = So | Mo | Di | Mi | Do | Fr | SaUm Vergleiche zu machen, deklarieren wir Tag als Instanz von Eq und OrdFhren Vergleich auf Vergleich von Ints zurck:class Enum a wherefromEnum :: a -> InttoEnum :: Int -> a

instance Enum Tag wherefromEnum So = 0fromEnum Mo = 1fromEnum Di = 2...toEnum analog

22Praktische Anwendunginstance Eq Tag where(x==y) = (toEnum x == toEnum y)

instance Ord Tag where(x StringBools , Chars wren sub-classes, [True, 'n', False] ::[ShowType]In Java sind die implementierten Interfaces/Klassen bei der Klassendefinition anzugeben, bei Haskell spteres Hinzufgen mglich

25Literatur [1] Simon Thompson, 1999. The Craft of Functional Programming, second edition, Addison Wesley Longman, Great Britain[2] Richard Bird, 1998. Introduction to Functional Programming using Haskell, second edition, Prentice Hallo, Great Britain[3] The Haskell 98 Report, December 2002, http://www.haskell.org/onlinereport/exps.html#list-comprehensions[4] D. Rsner, 2007. Einfhrung in Programmierparadigmen, Univ. Magedburg, http://wdok.cs.uni-magdeburg.de/studium-und-lehre/ lehrveranstaltungen/sommer2007/pgp/slides[5] Uwe Schmidt, 2002. Abstrakte Datentypen und das Typsystem von Haskell, FH Wedel, http://www.fh-wedel.de/~si/seminare/ss02/Ausarbeitung/2. types/typhas3.html[6] Peter Padawitz, 2005. bersetzerbau, Univ. Dortmund http://fldit-www.cs.uni-dortmund.de/~peter/Kapitel1-2.pdf26