www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

hasch

Gepostet:
08.11.2008 15:59

IO () - Summe aus zwei getLine Werten berechnen  
Habe folgendes Programm geschrieben:
readSum :: IO ()
readSum = do
zahl1 <- getLine
zahl2 <- getLine
putStrLn (zahl1)
putStrLn (zahl2)
putStrLn (show ( (toInteger zahl1) + (toInteger zahl1)))


Leider kommt dort immer die Meldung:
No instance for (Integral String) arising from a use of `toInteger'
Possible fix: add an instance declaration for (Integral String) In the first argument of `(+)', namely `(toInteger zahl2)'...

Hat jemand eine Ahnung, wie ich die Summe der zwei eingegeben Strings berechnen kann?

Zum Seitenanfang    
 
Siracusa

Gepostet:
08.11.2008 18:21

   
Hallo,

mit toInteger kannst du keinen String in eine Zahl konvertieren. Dafür gibt es z.B. die Funktion read. Allerdings wirft die eine Exception, falls der eingegebene String keine gültige Zahl ist.

Du kannst bspw. folgende Funktion verwenden, die einen String in ein Maybe Int konvertiert und Nothing zurückgibt, falls keine gültige Zahl gelesen werden konnte:
convInt :: String -> Maybe Int
convInt str = case reads str of
[(x, "")] -> Just x
otherwise -> Nothing

Für die Ausgabe kannst du dann dein composeMaybe vom letzten Mal verwenden und mußt noch eine Fallunterscheidung einfügen, falls Nothing rauskommt.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
hasch

Gepostet:
13.11.2008 16:45

   
Danke für deine Hilfe, das klappt bestens, allerdings stellt sich mir noch eine Frage, wie kann man ein IO () in einen String wandeln? Weil wir jetzt bsw. mehrere Zahlen einlesen sollen (zuerst die die Anzahl der einzulesenen Zahlen eingegeben) und da ich getLine nur in einer do-Anweisung kapseln kann und somit entweder mit putStr oder return einen Wert zurückliefern muss, scheitere ich etwas. Hast du oder jemand anderes dazu evtl. auch eine Idee?
Zum Seitenanfang    
 
Siracusa

Gepostet:
15.11.2008 00:16

   
Hallo,

ja, das ist richtig so! Aus dem do bzw. aus der IO-Monade kommst du nicht mehr raus. Da gibt es zwar auch Hintertürchen, aber das sind böse Haskell-Hacks, die euer Lehrer/Tutor/Prof. sicher nicht von euch verlangen wird. ;-)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
hasch

Gepostet:
15.11.2008 19:45

   
Danke dir. Habe nun die rekursive Abarbeitung einfach vorgezogen in die Zustandszuweisungen und es klappt, möchte euch das Ergebnis natürlich nicht vorenthalten:

-- Liest Anzahl der einzugebenen Zahlen ein und gibt Ergebnis aus
readSumN :: IO ()
readSumN = do
n <- getLine
sum <- readN (read n)
putStrLn ("Ergebnis: " ++ sum)

-- Liest einzelne Zahl ein und summiert rekursiv
readN :: Int -> IO String
readN 0 = return "0"
readN n = do
x <- getLine
y <- readN (n-1)
return (show(read x + read y))
Zum Seitenanfang