Haskell: Was meint der Compiler damit?
Hallo,
einmal der Code:
module Task29 where
import System.IO
main :: IO ()
main = do
hSetBuffering stdout NoBuffering -- needed depending on your operating system and settings
putStrLn "Bitte gebe die erste Zahl ein:"
x1 <- readLn
putStrLn "Zweite"
x2 <- readLn
let sum = x1 + x2
print ("Die Summe ist:" ++ show(sum))
result <- while (x1,1) (\x -> x/=0) (\(x,count) -> do putStrLn "Bitte gebe die erste Zahl an"
x1 <- readLn
putStrLn "Zweite"
x2 <- readLn
let sum = x1 + x2
print ("Die Summe ist:" ++ show(sum))
return (x1,(count+1)))
print ("Anzahl additionen:" ++ show(snd(result)))
while :: a -> (a -> Bool) -> (a -> IO a) -> IO a
while a p body = loop a
where loop x = if p x then do x'<- body x
loop x'
else return x
Und einmal die beschwerde:
das Gleich kommt bei let sum = x1 + x2, bei show und bei der 1 im Tupel (x1,1), und bei /=0.
Ich verstehe nicht was der mir damit sagen will und wie ich das lösen kann.
Schonmal danke:))
1 Antwort
Vom Fragesteller als hilfreich ausgezeichnet
x1 und x2 sollen hier vermutlich Gleitkommazahlen aufnehmen, die dann im weiteren Verlauf der Programmausführung addiert werden.
Das Problem ist, dass Haskell den Datentyp von X1, x1 nicht ermitteln und deshalb auch nicht entscheiden kann, welche Definition von readLn zu verwenden ist.
An einem sehr verkürzten Beispiel zeige ich zwei mögliche Auswege:
erster Ausweg: Hilfsfunktion zum Lesen eines Float-Werts:
import System.IO
readFloat :: IO Float
readFloat = readLn
main :: IO ()
main = do
x <- readFloat
y <- readFloat
let sum = x + y
print(sum)
zweiter Ausweg: Verwendung eines Cast:
import System.IO
main :: IO ()
main = do
x <- readLn :: IO Float
y <- readLn :: IO Float
let sum = x + y
print(sum)
Etwas in der Art könnte in deinem Programm weiterhelfen.
Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler