Algebraische Datentypen

[Back]

Das Beispiel Kalenderverwaltung

Um eine Verwaltung aufzubauen ist eine strenge Typvergabe unter Haskell notwendig. Die Wochentage würden 7 Tage umfassen und damit aufzählbar sein. Eine entsprechende Datenstruktur, die einen beliebigen Wochentag repräsentiert, ist durch einen besonderen algebraischen Datentyp, dem Aufzähltyp realisierbar. Eine Verwendung stellt das folgende Beispiel dar.

01   data  Wochentag = Mo | Di | Mi | Do | Fr | Sa | So
02 
03   wochenende :: Wochentag -> Bool
04 
05   wochenende Sa = True
06   wochenende So = True
07   wochenende _  = False

Einen echten algbraischer Datentypen repräsentiert die folgende Signatur. Entscheidend sind hier die sogenannten Konstruktoren, die eine Arbeit auf dem Datentyp ermöglichen.
Ein Datentyp Datum hätte die folgende mögliche Signatur. D wäre der sogenannte Konstruktor mit dem es möglich ist, den Datentyp zu verwenden.
Tag und Jahr können als Typsysnoyme definiert werden. Eine größere Schwierigkeit stellt die Signatur und Verwendung des Datentyps Monat dar. Um auf diesem Datentyp arbeiten zu können, ist es notwendig Eigenschaften vom Haskell - Klassensystem abzuleiten und eine Instanz der Klasse Show zu erzeugen, auf deren Grundlage eine Ausgabe der Monate möglich ist.

01   data  Datum = D Tag Monat Jahr
02 
03   type  Tag  = Int
04   type  Jahr = Int
05 
06   data  Monat = Jan | Feb | Mar | Apr | Mai | Jun
07               | Jul | Aug | Sep | Okt | Nov | Dez
08                 deriving Eq
09 
10   zeigeMonat :: Monat -> String
11   zeigeMonat a
12              | a == Jan = "Januar    "
13              | a == Feb = "Februar   "
14              | a == Mar = "Maerz     "
15              | a == Apr = "April     "
16              | a == Mai = "Mai       "
17              | a == Jun = "Juni      "
18              | a == Jul = "Juli      "
19              | a == Aug = "August    "
20              | a == Sep = "September "
21              | a == Okt = "Oktober   "
22              | a == Nov = "November  "
23              | a == Dez = "Dezember  "
24             
25   instance  Show Monat where
26             show = zeigeMonat

Folgendes Beispiel zeigt des Umgang mit dem Konstruktor D.

01   heute  :: Datum
01   heute  =  D 24 Nov 1234

Nun können Selektoren definiert und boolsche Abfragen, wie Schaltjahrestest etc. durchgeführt werden.

01 -- Selektoren
02 
03   tag     :: Datum -> Tag
04   monat   :: Datum -> Monat
05   jahr    :: Datum -> Jahr
06 
07   tag   (D d m y)   = d
08   monat (D d m y)   = m
09   jahr  (D d m y)   = y
10 
11 -- Abfragen
12 
13   weihnacht  :: Datum -> Bool
15   weihnacht (D a b c)
16             | a == 24 && b == Dez = True
17             | otherwise           = False
18 
19   schaltjahr  :: Datum -> Bool
20   schaltjahr (D a b c)
21              | mod c 400 == 0 || (mod c 4 == 0) && (mod c 100 /= 0) = True
22              | otherwise                                            = False

 [Anwendungen zum Kalendertyp] [TOP]