Maps
  | 
       Seien k und v Variablen für
Datentypen (Wertebereiche)
         | 
     
     
       Map k v
  | 
        ist der Wertebereich aller Maps 
mit Schlüssel vom Typ k 
mit Wert (Attribut) vom Typ v
  | 
  |  | 
     
     
        | 
       Verzeichnisse sind spezielle Mengen
         | 
     
     
        | 
       Sie werden aber so häufig verwendet, dass es sich lohnt,
sie extra zu behandeln
         | 
     
     
        | 
       
type Map' k a = Set (k, a) 
  
invMap' :: Set (k, a) -> Bool 
invMap' m 
  = ∀ (k1,a1) ∈ m ⋅ 
    ∀ (k2,a2) ∈ m ⋅ 
      k1 == k2 => a1 == a2 
 
         | 
     
     
        | 
       Zusätzliche Konsistentbedingungen werden durch Datentyp-Invarianten
beschrieben.
  | 
        | 
        Solche Invarianten sind Funktionen von einem Wertebereich in die Wahrheitswerte
  | 
        | 
        Eine mögliche Definition
  | 
        | 
       
type Invariant a = a -> Bool 
 
         | 
     
     
        | 
       Die im Beispiel verwendete Notation ist eine mathematische, nicht die Standard-Haskell Notation,
sie kann aber 1-1 in Haskell umgesetzt werden
  | 
        | 
       
invMap' :: (Eq k, Eq a) => Set (k, a) -> Bool 
invMap' m 
  = and [ not (k1 == k2) || a1 == a2 
        | (k1, a1) <- elems m, 
          (k2, a2) <- elems m 
        ] 
 
         | 
     
     
       Implementierung  | 
       analog zu Mengen
  | 
        | 
       im Gegensatz zu Listen nicht in der Sprache vordefiniert,
sondern in einem Modul der Basisbibliothek vordefiniert.
  | 
        | 
        | 
     
     
       Beispiele  | 
       
         | 
     
     
       Typen
  | 
       
Map String Int 
Map Int Bool 
Map String (Int -> Int) 
 
         | 
     
     
       Werte
  | 
       
{ "abc" :-> 25, ... } 
  
{ 1 :-> False, 2 :-> True, ...} 
  
{ "sqr" :-> \x -> x * x } 
 
         | 
     
     
       vordefinierte Operationen
  | 
        wie bei den Mengen, außerdem noch lookup, insert, keys, ...
         | 
     
     
        | 
        Felder können durch Maps modelliert werden.
         | 
     
     
        | 
        Der Schlüssel ist der Index.
         | 
     
     
        | 
       
type A = array[min..max] of String 
  
type A = Map Int String 
  
invA :: Map Int String -> Bool 
invA m 
  = keys m == {min .. max} 
 
         | 
     
     
        | 
        Listen können durch Maps modelliert werden. 
In Datenbanken von Bedeutung.
         | 
     
     
        | 
        Relationen mit einer Schlüsselkomponente können durch Maps modelliert werden.
         | 
     
     
        | 
       
type Rel = Set (Name, SurName, Age, Salary) 
  
  
type Rel = Map (Name, SurName) (Age, Salary) 
 
         | 
     
     
        | 
        Felder und Relationen sind Spezialfälle von Maps
         |