Funktionale Programmierung mit Haskell/ Beispielprogramme/ Zugriff auf Tripel
Zugriff auf eine Liste von Tripeln
BearbeitenIm Kapitel Tupel greifen wir mittels lookup
auf ein 2-Tupel zu. In diesem Beispiel haben wir eine Liste von 3-Tupeln (Tripel), die wir mittels List comprehension durchsuchen.
Die Anwendung verarbeitet eine Liste von Ländern mit ihrer Vorwahl und der Top-Level-Domain (TLD). Durch die Eingabe eines Ländernamens erfahren wir die zugeordneten Werte.
module KeyValue2
where
type Land = String
type Vorwahl = Integer
type Tld = String
type LaenderListe = [(Land, Vorwahl, Tld)]
laenderListe :: LaenderListe
laenderListe = [("Afghanistan", 93, ".af"),
("Ägypten",20, ".eg"),
("Albanien", 355, ".al"),
("Algerien", 213, ".dz")] -- usw...
main = do
putStrLn "Bitte ein Land eingeben"
datString <- getLine
let land = datString
-- wir lösen diese Aufgabe mit List comprehension
let tld = [y|(x,_,y)<-laenderListe,x==land]
let vorw = [y|(x,y,_)<-laenderListe,x==land]
-- so schreibt man in Haskell die Ungleichheit:
if not ((length tld == 1)&&(length vorw == 1))
then putStrLn ("Fehler mit Eingabe: "++land)
-- da hinter else mehrere Anweisungen stehen, setzen wir einen do-Block
else do
putStrLn ("Die TLD zu "++land++" ist "++ show (head tld))
putStrLn ("Die Vorwahl zu "++land++" ist +"++ show (head vorw))
Erläuterungen:
- Im Definitionsteil werden benutzerdefinierte Typen angelegt, danach wird die
laenderListe
aufgebaut. Im Hauptprogramm wird man aufgefordert, den Ländernamen einzugeben. Diese Eingabe wird in den List comprehensions als Suchschlüssel verwendet. - Wenn nicht bei jeder Suche genau ein Element gefunden wird, stimmt etwas nicht: Bei Null Elementen wird der Eingabewert nicht gefunden, bei mehr als einem Element ist die Liste nicht korrekt aufgebaut. In beiden Fällen wird ein Fehler ausgegeben. Im Gutfall werden zum eingegebenen Land die Vorwahl und die TLD ausgegeben.
Zur Laufzeit sieht das Ganze so aus:
$> ghci KeyValue2.hs
...
Ok, modules loaded: KeyValue2.
KeyValue2> main
Bitte ein Land eingeben
Ägypten
Die TLD zu Ägypten ist ".eg"
Die Vorwahl zu Ägypten ist +20
KeyValue2> main
Bitte ein Land eingeben
Egypten
Fehler mit Eingabe: Egypten
KeyValue2>