Motivation
  | 
       (+) berechnet die Summe zweier Zahlen des gleichen Typs
         | 
     
     
       ?  | 
       Typ von (+)
  | 
        | 
       
(+) :: Int     -> Int     -> Int 
(+) :: Integer -> Integer -> Integer 
(+) :: Double  -> Double  -> Double 
(+) :: a       -> a       -> a 
 
 | 
  |  | 
     
     
       Lösung
  | 
       Typ-Klassen (kurz: Klassen)
         | 
     
     
       Definition
  | 
       Eine Typ-Klasse ist ein Name für eine Schnittstelle. 
  Eine Schnittstelle enthält eine Menge von Funktions-Deklarationen
         | 
     
     
       Definition
  | 
       Ein Typ ist eine Instanz einer Typ-Klasse, 
    wenn er die Funktionen der Schnittstelle implementiert.
         | 
     
     
       Beispiel
  | 
       Num ist eine Typ-Klasse, die die Funktionen (Operatoren) 
    (+), (-), (*), negate, abs, signum enthält
  | 
        | 
       
(+) :: Num a => a -> a -> a 
 
         | 
     
     
       Definition
  | 
       Ein Typ, der eine Klassen-Einschränkung (class constraint) enthält,
    ist ein überladener Typ
         | 
     
     
       Elementare Klassen
  | 
       
class Eq a where 
  (==) :: a -> a -> Bool 
  (/=) :: a -> a -> Bool 
  
class Eq a => Ord a where 
  compare :: a -> a -> Ordering 
  (<)  :: a -> a -> Bool 
  (<=) :: a -> a -> Bool 
  (>)  :: a -> a -> Bool 
  (>=) :: a -> a -> Bool 
  max  :: a -> a -> a 
  min  :: a -> a -> a 
  
class Num a where 
  (+)     :: a -> a -> a 
  (-)     :: a -> a -> a 
  (*)     :: a -> a -> a 
  negate  :: a -> a 
  abs     :: a -> a 
  signum  :: a -> a 
  fromInteger :: Integer -> a 
 
  | 
  |  | 
     
     
        | 
        Alle elementaren Typen (Bool, Char, Int, Integer, Float, Double, ...) 
  besitzen eine Instanz von Eq und Ord
         | 
     
     
        | 
       Alle Listen-Typen, deren Element-Typ eine Instanz von Eq und Ord besitzt, 
  besitzen eine Instanz von Eq und Ord
         | 
     
     
        | 
       Alle Tupel-Typen, deren Komponenten-Typen Instanzen von Eq und Ord besitzen, 
  besitzen eine Instanz von Eq und Ord
         | 
     
     
        | 
       Funktions-Typen und Typen, die Funktions-Typen enthalten, besitzen 
  keine Instanz von Eq und Ord
  | 
  |  | 
     
     
       Ausgabe und Konversion in Strings
  | 
       mit einer Typklasse Show
  | 
        | 
       
class Show a where 
  show :: a -> String 
 
        | 
     
     
        | 
       Alle Typen, deren Werte ausgegeben werden sollen, benötigen eine Instanz von Show
         | 
     
     
        | 
        Alle elementaren Typen (Bool, Char, Int, Integer, Float, Double, ...) 
  besitzen eine Instanz von Show
         | 
     
     
        | 
       Alle Listen-Typen, deren Element-Typ eine Instanz von Show besitzt, 
  besitzen eine Instanz von Show
         | 
     
     
        | 
       Alle Tupel-Typen, deren Komponenten-Typen Instanzen von Show besitzen, 
  besitzen eine Instanz von Show
         | 
     
     
        | 
       Funktions-Typen und Typen, die Funktions-Typen enthalten, besitzen 
  keine Instanz von Show
  | 
  |  | 
     
     
       Eingabe und Konversion aus Strings
  | 
       mit einer Typklasse Read
  | 
        | 
       
read :: Read a => String -> a 
 
        | 
     
     
        | 
       Alle Typen, deren Werte aus Zeichenreihen (Strings) konstruiert werden sollen,
  müssen eine Instanz von Read besitzen.
         | 
     
     
        | 
        Alle elementaren Typen (Bool, Char, Int, Integer, Float, Double, ...) 
  besitzen eine Instanz von Read
         | 
     
     
        | 
       Alle Listen-Typen, deren Element-Typ eine Instanz von Read besitzt, 
  besitzen eine Instanz von Read
         | 
     
     
        | 
       Alle Tupel-Typen, deren Komponenten-Typen Instanzen von Read besitzen, 
  besitzen eine Instanz von Read
         | 
     
     
        | 
       Funktions-Typen und Typen, die Funktions-Typen enthalten, besitzen 
  keine Instanz von Read
         |