--------------------------------------------------
--  IO Exceptions in Haskell
--
--  userError :: String -> IOError
--  ioError   :: IOError -> IO a
--  catch     :: IO a -> (IOError -> IO a) -> IO a
--  
--------------------------------------------------

------------------------------------------------
-- Einlesen und Aufsummieren von Zahlen       --
-- mit Restriktion der Eingabe auf Zahlen <10 --
------------------------------------------------

f     :: Int -> IO Int
f sum =  do line <- getLine
            if null line then return sum else 
              do let val = read line
                 -- Ausnahmebehandlung: "raise exception" bei Eingabe >= 10
                 if val >= 10 
                   then ioError (userError "Nur Zahlen <10 sind als Eingabe erlaubt!")
                 -- Ende Ausnahmebehandlung
                   else let newSum = val + sum in
                         do putStrLn ("Summe: " ++ show newSum 
                                              ++ '\n':"Naechste Zahl?")
                            f newSum

main :: IO ()
main = ( do putStrLn ("Erste Zahl?")
            erg <- f 0
            putStrLn ("\nEndergebnis:" ++ show erg)
       ) 
-- Ausnahmebehandlung: Fehlermeldung ausgeben und Neustart       
       `catch` (\ err -> do { putChar '\n' ;
	                            putStrLn (show err ++ " -> Restart!");
	                            main }
	                )
