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
|