module Angabe2 where {- 1. Vervollstaendigen Sie gemaess Angabentext! 2. Vervollständigen Sie auch die vorgegebenen Kommentaranfänge! 3. Loeschen Sie keine Deklarationen aus diesem Rahmenprogramm, auch nicht die Modulanweisug! 4. Achten Sie darauf, dass `Gruppe' Leserechte fuer Ihre Abgabedatei hat! -} -- Aufgabe A.1 -- Ergaenzen Sie fehlende Typklassen in deriving-Klauseln, wo noetig und nicht explizit -- eine Instanz-Deklaration gefordert ist. type Nat1 = Int newtype Vorname = Vorname String deriving (Eq,Show,Ord) newtype Nachname = Nachname String deriving (Eq,Show,Ord) data VHDS = Viertel | Halb | Dreiviertel | Schlag deriving (Eq,Ord,Show) data Stunde = Eins | Zwei | Drei | Vier | Fuenf | Sechs | Sieben | Acht | Neun | Zehn | Elf | Zwoelf deriving (Eq,Ord,Show) data VorNachMittag = VM | NM deriving (Eq,Ord,Show) newtype Uhrzeit = U (VHDS,Stunde,VorNachMittag) deriving (Eq,Ord,Show) data Tag = I | II | III | IV | V | VI | VII | VIII | IX | X | XI | XII | XIII | XIV | XV | XVI | XVII | XVIII | XIX | XX | XXI | XXII | XXIII | XXIV | XXV | XXVI | XXVII | XXVIII | XXIX | XXX | XXXI deriving (Eq,Ord,Show) data Monat = Jan | Feb | Mar | Apr | Mai | Jun | Jul | Aug | Sep | Okt | Nov | Dez deriving (Eq,Ord,Show) type Jahr = Nat1 data Datum = D { tag :: Tag, monat :: Monat, jahr :: Jahr } deriving (Eq,Show,Ord) data Testart = PCR | Antigen deriving (Eq,Show,Ord) data Impfstoff = AstraZeneca | BioNTec | JundJ | Moderna | Sputnik | Sinovac deriving (Eq,Show,Ord) data Anzahl = Einmal | Zweimal deriving (Eq,Show,Ord) data DreiG_Status = Geimpft { impfstoff :: Impfstoff, anzahl :: Anzahl } | Genesen | Getestet { testart :: Testart, datum :: Datum, uhrzeit :: Uhrzeit } | Udrei deriving (Eq,Show,Ord) -- Udrei: Ungetestet, Ungenesen, Ungeimpft data Regel = DreiG | ZweieinhalbG | ZweiG deriving Eq data Person = P { vorname :: Vorname, nachname :: Nachname, dreig_status :: DreiG_Status } deriving (Eq,Ord) type Einlassbegehrende = [Person] type VorUndNachname = String type Einzulassende = [VorUndNachname] type Abzuweisende = [VorUndNachname] type Kontrollzeitpunkt = (Datum,Uhrzeit) data Kontrollergebnis = Einlassen | Abweisen | Ungueltig deriving (Eq,Show) -- General functions was_sick :: Person -> Bool was_sick p | dreig_status p == Genesen = True | otherwise = False is_vaccinated :: Person -> Bool is_vaccinated p = case dreig_status p of Geimpft _ _ -> True _ -> False is_tested :: Person -> Bool is_tested p = case dreig_status p of Getestet _ _ _ -> True _ -> False full_months::[Monat] full_months = [Jan, Mar, Mai, Jul, Aug, Okt, Dez] is_date_valid :: (Datum, Uhrzeit) -> Bool is_date_valid (d, u) | monat d == Feb = let y = jahr d in let t = tag d in if y `mod` 4 /= 0 && t > XXVIII then False else if y `mod` 100 == 0 && y `mod` 400 /= 0 then False else if t > XXIX then False else True | tag d > XXX && not(monat d `elem` full_months) = False | tag d > XXXI = False | otherwise = True -- Aufgabe A.2 {- Knapp, aber gut nachvollziehbar geht einzulassen folgendermassen vor: ... -} einzulassen :: (Person,Regel,Kontrollzeitpunkt) -> Kontrollergebnis einzulassen (p, r, k) | dreig_status p == Udrei = Abweisen | otherwise = should_allow p r k should_allow :: Person -> Regel -> Kontrollzeitpunkt -> Kontrollergebnis should_allow p ZweiG k | (not (was_sick p)) || (not (is_vaccinated p)) = Abweisen | otherwise = check_cert_validity p k should_allow p ZweieinhalbG k | is_tested p = if testart (dreig_status p) == Antigen then Abweisen else check_cert_validity p k | otherwise = check_cert_validity p k should_allow p DreiG k = check_cert_validity p k check_cert_validity :: Person -> Kontrollzeitpunkt -> Kontrollergebnis check_cert_validity p k | not(is_date_valid k) = Ungueltig | is_tested p && not(is_date_valid ((datum (dreig_status p)), (uhrzeit (dreig_status p)))) = Ungueltig | otherwise = Einlassen -- Aufgabe A.3 --einzulassende :: Einlassbegehrende -> Regel -> Kontrollzeitpunkt -> Einzulassende {- Knapp, aber gut nachvollziehbar geht einzulassende folgendermassen vor: ... -} -- Aufgabe A.4 --einzulassende_abzuweisende :: Einlassbegehrende -> Regel -> Kontrollzeitpunkt -> ([Einzulassende],[Abzuweisende]) {- Knapp, aber gut nachvollziehbar geht einzulassende_abzuweisende folgendermassen vor: ... -} -- Aufgabe A.5 --instance Show Uhrzeit where --show ... {- Knapp, aber gut nachvollziehbar geht die Implementierung von show fuer Uhrzeit folgendermassen vor: ... -} --instance Show Datum where -- show ... {- Knapp, aber gut nachvollziehbar geht die Implementierung von show fuer Datum folgendermassen vor: ... -}