Zum Inhalt springen

Funktionale Programmierung mit Haskell/ Beispielprogramme/ Zugriff auf Tripel

Aus Wikibooks

Zugriff auf eine Liste von Tripeln

[Bearbeiten]

Im 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.

Align=none
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:

Align=none ghci

$> 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>