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]