0/22. Proseminar Programmiersysteme WS 2003/04. Typklassen: Haskell. Mark Kaminski. Betreuer: Andreas Rossberg. 1. April 2004

Relevanta dokument
Logik für Informatiker

Akademiker Öppning. Öppning - Introduktion. I denna uppsats kommer jag att undersöka/utreda/utvärdera/analysera...

Aspekte zur Character Semantik

Metallmaßstäbe RL. Inhaltsverzeichnis

Nachrichten auf Deutsch

Hej! God morgon! Tjänare! Hejsan! 1 Hej!

TAXUD/801/2004 DE Nachtrag Nr.: 2 Datum: Das Handbuch Versandverfahren wird wie folgt geändert:

2. Setz die passende Verbform ein! (2 Punkte pro richtige Form!) / 16

ARBETSBLAD. KORTFILMSKLUBBEN TYSKA Bamboule

Grammatikübungsbuch Schwedisch

Nachrichten auf Deutsch 09. April 2011

Mycket formellt, mottagaren har en speciell titel som ska användas i stället för namnet

TYSKA, KORT LÄROKURS, skriftlig del

Einstufungstest Välkomna! Aufgabenblätter

Kan jag ta ut pengar i [land] utan att behöva betala extra avgifter? Fragen, ob Gebühren anfallen, wenn man in einem bestimmten Land Geld abhebt

TYSKA. Mango, das Zebra. Baby-Tiere. Diese Arbeitsblätter gibt es: 1. Vokabeln zur Sendung 2. Aufgaben zur Sendung 3. Lösungen ARBETSBLAD 2007/08

ARBETSBLAD KORTFILMSKLUBBEN TYSKA. Durch die Blumen (lätt) Ordkunskap Välj ut 10 av orden/fraserna nedan och sätt ihop en dialog på tyska!

4.2 Konstantes Fördervolumen Doppelpume

PROPOSITIONENS HUVUDSAKLIGA INNEHÅLL

Nachrichten auf Deutsch

Välkomna! Einstufungstest. Aufgabenblätter

Var kan jag hitta formuläret för? Var kan jag hitta formuläret för? Fragen wo man ein Formular findet

Lagrange-Projektion. LMU München, Germany Thomas Schöps. Hüttenseminar im Zillertal bei Prof. Lars Diening Wintersemester 2014/2015

301 Tage, Deutschland

Hallo und herzlich willkommen zu Unsere Hitliste! Ich bin Niklas, und hier sind meine vier Freunde...

Prävention alkoholbedingter Jugendgewalt (PAJ) Radioprojekt Webgeflüster

4 Fritid. 1 De tycker om att gå på restaurang. a Skriv under bilderna! Schreiben Sie unter die Bilder: Was machen die Personen?

BUNDESGESETZBLATT FÜR DIE REPUBLIK ÖSTERREICH. Jahrgang 1997 Ausgegeben am 6. Mai 1997 Teil III

Tariff Kit. Installatörshandbok Tariff Kit för NIBE F1330 LEK. Installer manual Tariff Kit for NIBE F1330

PPV-Serie. DIN Axialkolben Verstellpumpe für LKW Nebenabtrieb mit Load Sensing-Regler. Erstinbetriebnahme: Saugstutzen muß separat bestellt werden

Türkisch für Anfänger

WiLlk. VÄLKo. WiLlkommen. VÄLkOMMEN

TYSKA. Türkisch für Anfänger. Teil 5. Diese Arbeitsblätter gibt es:

Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h

Sveriges överenskommelser med främmande makter

BÄTTRE ÄN NÅGONSIN. Bäste medarbetare

Optioner Options Optionen

SchwedenQuiz. Quiz & Spiele. Diese Arbeitsblätter gibt es: 1. Vokabeln zur Sendung 2. Was weißt du über Schweden? (frågeformulär) 3.

Leroy. Teil 1. A R B E T S B L A D PROGRAMNR / tv1

Veranda. DE Installationshandbuch V17/16

Lite skoj - typ. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

SERVICEINSTRUKTION Tider. SERVICE INSTRUCTION Times. Zeiten SIT SE/GB/DE M10401 FIGHTER 2005/2010

Buske Sprachkalender SCHWEDISCH 2016

Präpositionen. efter. från. von: beim Passiv zur Angabe des Urhebers Tavlan är målad av en svensk konstnär.

Bewerbung Anschreiben

Türkisch für Anfänger

CTC Rumsdisplay CTC Roomdisplay Installations- och skötselanvisning. Installation and maintenance instructions

Immigration Bostad. Bostad - Hyra. Ange att du vill hyra någonting. ein Zimmer Typ av bostad. eine Wohnung/ ein Apartment Typ av bostad.

PROJEKT LERNRAUM CAMPUS DIPL. ING KATJA NINNEMANN, ARCHITEKTIN DWB

Om översattandets konst

Fußball und Skate. Eliteschule - Training - trainieren - Sport - Verein - Fußballerin - laufen - skaten - schwimmen - Fahrrad fahren

Kulturminnesvårdens perifera organisation Bergstrand, Axel Fornvännen 1939(34), s

F1220, F1230, F1120, F1130

Omkring trädgårdsbordet på Glimmingehus Thordeman, Bengt Fornvännen Ingår i:

Ich bin der Jens ich bin der Jens Jansen ich bin hier der Vater der Familie von Mette, Gesa, Helge, Sonja und jetzt auch von Sofi.

IZZI. design ruud ekstrand

Lektion. 1Hej! Vad heter du? Sprachkurs Schwedisch, Buch 2012 Hueber Verlag, Ismaning, ISBN

Reisen Unterwegs. Unterwegs - Ort. Jag har gått vilse. Du weißt nicht, wo Du bist

Schwedisch A1, 2. Februar 2017 S. 1/9

Gebrauchsanweisung. Bure. Gehwagen. Bure XL

WALLMEK i Kungälv AB Special tools for auto repairs

TYSKA. Türkisch für Anfänger. Teil 6. Diese Arbeitsblätter gibt es:

Jurtor-by på JUVENGÅRD

Eine haarige Verwandlung

Deutsch lernen und lehren I, 3 högskolepoäng

TYSKA, KORT LÄROKURS

In Ringen und Werffen können nachvolgende \ück nützlich gebraucht werden, deren seindt achtzehen

301 Tage, Deutschland

Föreläsning 7 i programmeringsparadigm. Ytterligare Högre ordningens funktioner: filter, foldr foldl. Hutton 7.2, 7.3 och 7.4.

Nachrichten auf Deutsch 12. März 2011

301 Tage, Deutschland

Resa Logi Logi - Hitta boende Svenska Tyska Wo kann ich finden? ... ein Zimmer zu vermieten? ... ein Hostel? ... ein Hotel?

Resa Logi Logi - Hitta boende Tyska Svenska Var hittar jag? ... ett rum att hyra? ... ett vandrarhem? ... ett hotell? ... ett bed-and-breakfast?

Svensk författningssamling

SERVICEINSTRUKTION Värmeproduktion. SERVICE INSTRUCTION Heat production. Wärmeerzeugung SIT SE/GB/DE M10383 FIGHTER 1320

Musik für jede Laune. Sag s mir!

Türkisch für Anfänger

Nachrichten auf Deutsch

Ansökan Följebrev. Följebrev - Inledning. Formellt, manlig mottagare, namnet okänt. Formellt, kvinnlig mottagare, namnet okänt

Seminar Rough Sets. Präsentation von Christian Köllner Betreuer: Philipp Bender. Wintersemester 2003 / 04

F1220, F1230, F1120, F1130

HANDPUMP H-11 DIRECTIONS FOR USE BRUKSANVISNING GEBRAUCHANWEISUNG

Beispiel Magazin. TV-Möbel Romina % [ + [ 7 FP 'LPPEDUH ZHL H /(' %HO inklusive Fernbedienung. TV-Möbel Vicenza % [ + [ 7 FP

Tala: die Schule und der Stundenplan. Skriva: kennen lernen (träna perfekt) Drama: Levon lernt Svetlana kennen

Mein Berlin Levon Mitt Berlin Levon

TYSKA. Überraschungsparty! Feste & Feiern. Diese Arbeitsblätter gibt es:

Türkisch für Anfänger

Deutsche Hits. Diese Arbeitsblätter gibt es:

Innehäll. F Wir übersetzen ins Deutsche (Översättning av mask. subst. och motsvarande pers. pron.) 14

Lagrådsremiss. Skatteavtal mellan Sverige och Österrike. Lagrådsremissens huvudsakliga innehåll. Regeringen överlämnar denna remiss till Lagrådet.

TYSKA. Unsere Hitliste. Musik & Co. Diese Arbeitsblätter gibt es:

SCdefault. 9-5 Monteringsanvisning

2. Vad handlar avsnittet om? Läroplanen säger: Förstå och tolka innehållet i talat språk ( ). 3. Ord och fraser

4. Dialogövning Läroplanen säger: Olika former av samtal, dialoger och intervjuer.

Mr. Adam Smith Smith Plastics 8 Crossfield Road Selly Oak Birmingham West Midlands B29 1WQ

Mr. Adam Smith Smith's Plastics 8 Crossfield Road Selly Oak Birmingham West Midlands B29 1WQ

Die Johannesschüssel aus Norrby im Historischen Museum zu Stockholm : ein Werk des Henning von der Heide Paatz, Walter Fornvännen

Antrag auf Behandlung als unbeschränkt einkommensteuer-

Haskell forts. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Visual C# Grundlagen, Programmiertechniken, Datenbanken. Frank Eller. An imprint of Pearson Education

Transkript:

Proseminar Programmiersysteme WS 2003/04 0/22 Typklassen: Haskell Mark Kaminski Betreuer: Andreas Rossberg 1. April 2004

Zwei Arten von Polymorphismus parametrischer Polymorphismus 1/22 Prozedur definiert über eine Reihe von Typen, gleiches Verhalten für alle Typen Beispiel: foldl in Standard ML Hindley/Milner-Typsystem (ML, Miranda)

Zwei Arten von Polymorphismus parametrischer Polymorphismus 1/22 Prozedur definiert über eine Reihe von Typen, gleiches Verhalten für alle Typen Beispiel: foldl in Standard ML Hindley/Milner-Typsystem (ML, Miranda) ad-hoc - Polymorphismus (Überladen) Prozedur definiert über mehrere Typen, potenziell unterschiedliches Verhalten für jeden Typ Beispiele: +,* in Standard ML, >> in C++ wichtig bei der Realisierung von arithmetischen Operatoren, Vergleichsoperatoren unterschiedliche Ansätze in verschiedenen Sprachen

Parametrischer Polymorphismus und Überladen 2/22 Arithmetik: Überladen von Operatoren Beispiel: Standard ML fun square x = x*x > val square : int -> int

Parametrischer Polymorphismus und Überladen 2/22 Arithmetik: Überladen von Operatoren Beispiel: Standard ML fun square x = x*x > val square : int -> int Problem: square 3.14 nicht möglich

Parametrischer Polymorphismus und Überladen (2) 3/22 Gleichheit frühes Standard ML: Gleichheitsoperator überladen

Parametrischer Polymorphismus und Überladen (2) 3/22 Gleichheit frühes Standard ML: Gleichheitsoperator überladen Problem: fun member _ nil = false member x (y::yr) = x=y orelse member x yr member ist nicht polymorph

Parametrischer Polymorphismus und Überladen (2) 3/22 Gleichheit frühes Standard ML: Gleichheitsoperator überladen Problem: fun member _ nil = false member x (y::yr) = x=y orelse member x yr member ist nicht polymorph Caml, Miranda: Gleichheitstest polymorph

Parametrischer Polymorphismus und Überladen (2) 3/22 Gleichheit frühes Standard ML: Gleichheitsoperator überladen Problem: fun member _ nil = false member x (y::yr) = x=y orelse member x yr member ist nicht polymorph Caml, Miranda: Gleichheitstest polymorph Probleme: Laufzeitfehler beim Test von Prozeduren, inadequater Vergleich auf abstrakten Datentypen

Parametrischer Polymorphismus und Überladen (3) 4/22 Gleichheit Standard ML: Einschränkung des Polymorphismus Einführung von Typen mit Gleichheit (eqtypes)

Parametrischer Polymorphismus und Überladen (3) 4/22 Gleichheit Standard ML: Einschränkung des Polymorphismus Einführung von Typen mit Gleichheit (eqtypes) Mängel: Anwendung des Gleichheitsoperators auf abstrakte Datentypen nur möglich, wenn Gleichheit mit Darstellungsgleichheit zusammenfällt Vergleich eines komplexen Datentyps nicht möglich, sobald der Typ mindestens eine nicht vergleichbare Komponente enthält

Typklassen: Grundideen Verallgemeinerung des Konzepts von eqtypes 5/22

Typklassen: Grundideen 5/22 Verallgemeinerung des Konzepts von eqtypes Operationen sind nur auf passende Typen anwendbar. Information über geeignete Argumenttypen geht als sog. Kontext in den Typ der Operation ein. Beispiele: (==) :: Eq a => a -> a -> Bool Gleichheitstest anwendbar auf Typen mit Gleichheit, angezeigt durch den Kontext Eq a (^) :: (Num a, Integral b) => a -> b -> a ganzzahlige Potenzierung fordert ganzzahlige Exponenten Eq, N um, Integral sind Typklassen. Ein Typschema mit Kontext wird als qualifizierter Typ bezeichnet.

Typklassen: Grundideen 5/22 Verallgemeinerung des Konzepts von eqtypes Operationen sind nur auf passende Typen anwendbar. Information über geeignete Argumenttypen geht als sog. Kontext in den Typ der Operation ein. Beispiele: (==) :: Eq a => a -> a -> Bool Gleichheitstest anwendbar auf Typen mit Gleichheit, angezeigt durch den Kontext Eq a (^) :: (Num a, Integral b) => a -> b -> a ganzzahlige Potenzierung fordert ganzzahlige Exponenten Eq, N um, Integral sind Typklassen. Ein Typschema mit Kontext wird als qualifizierter Typ bezeichnet. Der Benutzer kann neue Typklassen einführen und die bestehenden um neue Typen (Instanzen) erweitern.

Klassisches Beispiel: Gleichheit Definition der Klasse Eq von Typen mit Gleichheit: 6/22 class Eq a where (==) :: a -> a -> Bool Eingeführte Typbindung: (==) :: Eq a => a -> a -> Bool == wird als Methode der Klasse Eq deklariert. Jede Instanz der Klasse Eq muss eine Implementierung für == angeben.

Klassisches Beispiel: Gleichheit (2) Beispiele für Instanzen der Klasse Eq: 7/22 instance Eq Int where (==) = eqint instance Eq Bool where x == y = if x then y else not y

Klassisches Beispiel: Gleichheit (2) Beispiele für Instanzen der Klasse Eq: 7/22 instance Eq Int where (==) = eqint instance Eq Bool where x == y = if x then y else not y instance Eq a => Eq [a] where [] == [] = True x:xs == y:ys = x==y && xs==ys _ == _ = False

Arithmetik Klasse N um von Zahlen (vereinfacht): 8/22 class Num a where (+), (-), (*) :: a -> a -> a

Arithmetik Klasse N um von Zahlen (vereinfacht): 8/22 class Num a where (+), (-), (*) :: a -> a -> a Realisierung von square mit Typklassen: square x = x*x Eingeführte Typbindung: square :: Num a => a -> a

Arithmetik Klasse N um von Zahlen (vereinfacht): 8/22 class Num a where (+), (-), (*) :: a -> a -> a Realisierung von square mit Typklassen: square x = x*x Eingeführte Typbindung: square :: Num a => a -> a square ist nun auf alle Instanzen von Num anwendbar. square 5 25 :: Int square 3.14 9.8596 :: Float

Ableitung von Typklassen Konzepte: 9/22 Abgeleitete Klasse erbt alle Eigenschaften ihrer Basisklasse(n) und erweitert sie um neue.

Ableitung von Typklassen Konzepte: 9/22 Abgeleitete Klasse erbt alle Eigenschaften ihrer Basisklasse(n) und erweitert sie um neue. Jede Instanz der abgeleiteten Klasse ist zugleich eine Instanz der Basisklasse.

Ableitung von Typklassen Konzepte: 9/22 Abgeleitete Klasse erbt alle Eigenschaften ihrer Basisklasse(n) und erweitert sie um neue. Jede Instanz der abgeleiteten Klasse ist zugleich eine Instanz der Basisklasse. Beispiel: Definition der Klasse Ord der angeordneten Typen class Eq a => Ord a where (<), (<=), (>=), (>) :: a -> a -> Bool Ein Typ a kann nur dann Instanz der Klasse Ord sein, wenn er gleichzeitig als Instanz von Eq deklariert ist.

Ambiguität Gegeben seien folgende Signaturen: 10/22 read :: Read a => String -> a show :: Show a => a -> String Welchen Typ hat der Ausdruck show(read s)?

Ambiguität Gegeben seien folgende Signaturen: 10/22 read :: Read a => String -> a show :: Show a => a -> String Welchen Typ hat der Ausdruck show(read s)? show(read s) :: (Read a, Show a) => String

Ambiguität Gegeben seien folgende Signaturen: 10/22 read :: Read a => String -> a show :: Show a => a -> String Welchen Typ hat der Ausdruck show(read s)? show(read s) :: (Read a, Show a) => String Um welche Instanz von Read, Show handelt es sich beim Typ a?

Ambiguität Gegeben seien folgende Signaturen: 10/22 read :: Read a => String -> a show :: Show a => a -> String Welchen Typ hat der Ausdruck show(read s)? show(read s) :: (Read a, Show a) => String Um welche Instanz von Read, Show handelt es sich beim Typ a? Bei der Verwendung von Typklassen kann Typinferenz versagen.

Ambiguität Gegeben seien folgende Signaturen: 10/22 read :: Read a => String -> a show :: Show a => a -> String Welchen Typ hat der Ausdruck show(read s)? show(read s) :: (Read a, Show a) => String Um welche Instanz von Read, Show handelt es sich beim Typ a? Bei der Verwendung von Typklassen kann Typinferenz versagen. Auflösung von Ambiguitäten durch explizite Typconstraints möglich: show(read s :: Int) Im Allgemeinen widerspricht dies aber der Idee hinter Typklassen.

Ambiguität Gegeben seien folgende Signaturen: 10/22 read :: Read a => String -> a show :: Show a => a -> String Welchen Typ hat der Ausdruck show(read s)? show(read s) :: (Read a, Show a) => String Um welche Instanz von Read, Show handelt es sich beim Typ a? Bei der Verwendung von Typklassen kann Typinferenz versagen. Auflösung von Ambiguitäten durch explizite Typconstraints möglich: show(read s :: Int) Im Allgemeinen widerspricht dies aber der Idee hinter Typklassen. Sinnvolle Erweiterungen des Typklassensystems von Haskell verschlimmern das Problem der Ambiguität.

Typkonstruktoren Beispiel: Optionstypen in Haskell 11/22 data Maybe a = Nothing Just a Analog zur funktionalen Applikation lassen sich Typen wie M aybe Int darstellen als die Anwendung von Maybe auf Int. Objekte wie M aybe, die auf Typen angewandt wiederum Typen ergeben, heißen Typkonstruktoren. Im Gegensatz zu diesen werden gewöhnliche Typen wie Int auch Grundtypen genannt.

Typkonstruktoren (2) Funktionen auf Typebene 12/22

Typkonstruktoren (2) Funktionen auf Typebene als höherstufige Typen Bestandteil des Typsystems von Haskell 12/22

Typkonstruktoren (2) Funktionen auf Typebene als höherstufige Typen Bestandteil des Typsystems von Haskell Werte haben immer einen Grundtyp 12/22

Typkonstruktoren (2) Funktionen auf Typebene 12/22 als höherstufige Typen Bestandteil des Typsystems von Haskell Werte haben immer einen Grundtyp Formalisierung: System von Arten Arten (kinds) sind Typen von Typen. Grundtypen sind von der Art. Konstruktoren sind von der Art κ 1 κ 2, wobei κ 1, κ 2 selbst Arten sind. Beispiele: Int, Float :: * [], Maybe :: * -> * (->) :: * -> * -> *

Konstruktorklassen Typkonstruktoren können ebenso wie Grundtypen zu Klassen zusammengefasst werden. 13/22

Konstruktorklassen Typkonstruktoren können ebenso wie Grundtypen zu Klassen zusammengefasst werden. Beispiel: Die Functor-Klasse F unctor enthält Typen, für die die Operation map verfügbar ist. Es gilt: map id = id map (f. g) = map f. map g 13/22

Konstruktorklassen (2) class Functor f where map :: (a -> b) -> f a -> f b 14/22

Konstruktorklassen (2) class Functor f where map :: (a -> b) -> f a -> f b 14/22 Da f a ein Grundtyp sein muss, müssen alle Instanzen von Functor von der Art sein.

Konstruktorklassen (2) class Functor f where map :: (a -> b) -> f a -> f b 14/22 Da f a ein Grundtyp sein muss, müssen alle Instanzen von Functor von der Art sein. instance Functor [] where map f xs = [f x x<-xs] instance Functor Maybe where map _ Nothing = Nothing map f (Just x) = Just (f x)

Multi-Parameter-Typklassen Eine Klasse wird über Tupeln von Typen/Konstruktoren definiert. Typische Anwendungen: 15/22 Einschränkung der Anwendbarkeit eines Konstruktors auf bestimmte Typen Darstellung von Beziehungen zwischen Typen

Multi-Parameter-Typklassen (2) Beispiel: Datenstrukturen mit Zugriff durch Indizes 16/22 class Indexed c a i where sub :: c -> i -> a idx :: c -> a -> Maybe i instance Ord a => Indexed (SortedArray a) a Int where... instance Eq a => Indexed (Map a b) b a where...

Multi-Parameter-Typklassen (2) Beispiel: Datenstrukturen mit Zugriff durch Indizes 16/22 class Indexed c a i where sub :: c -> i -> a idx :: c -> a -> Maybe i instance Ord a => Indexed (SortedArray a) a Int where... instance Eq a => Indexed (Map a b) b a where... Je nach Fall können Elementtyp und Indextyp eingeschränkt werden.

Typklassen und OOP Ähnlichkeiten mit Klassen in C++/Java: Standardoperationen können auf vom Benutzer definierte Typen ausgeweitet werden. Klassendefinitionen entsprechen Schnittstellen (interfaces) in Java, abstrakten Basisklassen in C++. Methoden einer Typklasse entsprechen virtuellen Funktionen in C++. 17/22

Typklassen und OOP (2) Unterschiede: universeller Polymorphismus statt Subtyping-Polymorphismus Flexibleres Typsystem erlaubt neue Anwendungsmöglichkeiten für ad-hoc - Polymorphismus, z. B. dispatch nach (inferiertem) Ergebnistyp einer Prozedur. Trennung von Typdeklaration und Implementierung keine Kontrolle über die Sichtbarkeit von Feldern einer Klasse (Dies ist die Aufgabe des Modulsystems.) heterogene Datenstrukturen nur über Zusatzmechanismus (existenzielle Typen eine Erweiterung des Typsystems) 18/22

Zusammenfassung entwickelt für die Programmiersprache Haskell 19/22

Zusammenfassung entwickelt für die Programmiersprache Haskell generalisieren das Konzept von eqtypes 19/22

Zusammenfassung entwickelt für die Programmiersprache Haskell generalisieren das Konzept von eqtypes Erweiterung und Verallgemeinerung des Hindley/Milner-Systems 19/22

Zusammenfassung entwickelt für die Programmiersprache Haskell generalisieren das Konzept von eqtypes Erweiterung und Verallgemeinerung des Hindley/Milner-Systems ermöglichen die Typinferenz verbunden mit dem Überladen 19/22

Zusammenfassung entwickelt für die Programmiersprache Haskell generalisieren das Konzept von eqtypes Erweiterung und Verallgemeinerung des Hindley/Milner-Systems ermöglichen die Typinferenz verbunden mit dem Überladen verbinden den parametrischen Polymorphismus mit dem ad-hoc-polymorphismus 19/22

Literatur [1] P. Wadler and S. Blott. How to make ad-hoc polymorphism less ad-hoc. In 16th ACM Symposium on Principles of Programming Languages, Austin, Texas, January 1989. [2] M.P. Jones. A system of constructor classes: overloading and implicit higher-order polymorphism. Journal of Functional Programming 5, 1-36, January 1995. [3] S.P. Jones, M. Jones and E. Meijer. Type classes: Exploring the design space. In proceedings of the Second Haskell Workshop, Amsterdam, June 1997. [4] S.P. Jones. Bulk type with class. In Proceedings of the Second Haskell Workshop, Amsterdam, June 1997. [5] M.P. Jones. Type Classes with Functional Dependencies. In Proceedings of the 9th European Symposium on Programming, ESOP 2000, Berlin, Germany, March 2000. Springer-Verlag. [6] K. Läufer. Type classes with existential types. Journal of Functional Programming 6(3), 485-517, May 1996. 20/22

Klassisches Beispiel: Gleichheit (3) Überführung in das Hindley/Milner-System: 21/22 data EqDict a = EqDict (a -> a -> Bool) eq eq :: EqDict a -> a -> a -> Bool (EqDict e) = e eqdictint eqdictint :: EqDict Int = EqDict eqint

Klassisches Beispiel: Gleichheit (4) eqdictlist :: EqDict a -> EqDict [a] eqdictlist eqdicta = EqDict (eqlist eqdicta) 22/22 eqlist :: EqDict a -> [a] -> [a] -> Bool eqlist _ [] [] = True eqlist eqdicta (x:xs) (y:ys) = eq eqdicta x y && eq (eqdictlist eqdicta) xs ys eqlist _ = False

Klassisches Beispiel: Gleichheit (4) eqdictlist :: EqDict a -> EqDict [a] eqdictlist eqdicta = EqDict (eqlist eqdicta) 22/22 eqlist :: EqDict a -> [a] -> [a] -> Bool eqlist _ [] [] = True eqlist eqdicta (x:xs) (y:ys) = eq eqdicta x y && eq (eqdictlist eqdicta) xs ys eqlist _ = False Überführung von Ausdrücken: 1==2 eq eqdictint 1 2 [1,2]==[] eq (eqdictlist eqdictint) [1,2] []