Funktionale Programmierung mit Haskell/ Beispielprogramme/ Zahlenraten

Aus Wikibooks
Zur Navigation springen Zur Suche springen

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 Unterprogramm rate, die zu einem Modul namens RateZahl zusammengefasst werden.
  • Zwei Import-Anweisungen sind nötig, erstens um die Funktion getLine aus System.IO einzubinden, zweitens um die Funktion für die Zufallszahl randomRIO zu erhalten. Für die Übersichtlichkeit ist es zweckmäßig, hinter den import-Befehl in Klammern die zugehörige Funktion zu schreiben.
  • In der main-Funktion wird die do-Anweisung dafür verwendet, die Ein-und Ausgabebefehle zusammenzufassen. Der Operator <- ist eine Zuweisung der Zufallszahl an die Variable zahl (Haskell erlaubt an diesen Stellen kein =). Danach wird die Funktion rate 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 einer do-Anweisung eingeleitet, da Ein-und Ausgabeanweisungen folgen. Mittels getLine wird von der Konsole ein String eingelesen, der mit read 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.