Funktionale Programmierung mit Haskell/ Beispielprogramme/ Zahlenraten
Erscheinungsbild
In diesem Programm wird der Benutzer aufgefordert, eine Zahl zwischen Eins und Hundert möglichst schnell zu erraten. Wir nennen die Datei RateZahl.hs:
Zahlenraten
module RateZahl
where
import System.IO (getLine)
import System.Random (randomRIO)
main = do
putStrLn "Errate die Zahl zwischen Eins und Hundert"
zahl <- randomRIO (1::Int, 100)
rate zahl 1
putStrLn "Programmende."
rate zahl anzVersuche = do
putStrLn "Gib deinen Wert ein: "
-- Liest einen String ein
rateZ <- getLine
-- macht einen Int-Typ daraus
let wert = read rateZ
if wert < zahl
then do putStrLn "Deine Zahl ist zu niedrig"
rate zahl (anzVersuche+1)
else if wert > zahl
then do putStrLn "Deine Zahl ist zu hoch"
rate zahl (anzVersuche+1)
else do putStr "Richtig! Du hast "
putStr (show (anzVersuche))
putStrLn " Versuche gebraucht."
Erläuterungen:
- Das Programm besteht aus einem Hauptprogramm
main
und einem Unterprogrammrate
, die zu einem Modul namensRateZahl
zusammengefasst werden. - Zwei
Import
-Anweisungen sind nötig, erstens um die FunktiongetLine
ausSystem.IO
einzubinden, zweitens um die Funktion für die ZufallszahlrandomRIO
zu erhalten. Für die Übersichtlichkeit ist es zweckmäßig, hinter denimport
-Befehl in Klammern die zugehörige Funktion zu schreiben. - In der
main
-Funktion wird diedo
-Anweisung dafür verwendet, die Ein-und Ausgabebefehle zusammenzufassen. Der Operator<-
ist eine Zuweisung der Zufallszahl an die Variablezahl
(Haskell erlaubt an diesen Stellen kein=
). Danach wird die Funktionrate
aufgerufen, und zwar mit zwei Parametern: Der eben ermittelten Zufallszahl und einem Zähler für die Anzahl der Versuche, der auf Eins stehen muss. - Auch die
rate
-Funktion wird mit einerdo
-Anweisung eingeleitet, da Ein-und Ausgabeanweisungen folgen. MittelsgetLine
wird von der Konsole ein String eingelesen, der mitread
zu einer Zahl verwandelt wird. - Danach beginnt die Fallunterscheidung. Wenn die Zahl zu hoch oder zu niedrig ist, wird die Funktion
rate
rekursiv aufgerufen. Dabei wird der Zähler für die Anzahl der Versuche um Eins erhöht. Falls die Zahl richtig geraten wurde, endet die Rekursion und somit das Unterprogramm.