www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Brewer

Gepostet:
25.03.2010 22:13

IO-Fehler  
Hallo!

Hier mal eben mein Problem... Code sagt mehr als Tausend Worte:

main = map f [1..10]

f x = appendFile "test.txt" $ (show (x+1)) ++ "\n"


Die Funktion f tut ihren Dienst und schreibt ein Ergebnis in die Datei. Ich würde nun gern f (per main) aufrufen mit jeweils anderer Variable - hier [1..10].
Als Ausgabe stelle ich mir das dann so vor:
2
3
4
.
.
11


Nur leider kommt an dieser Stelle der IO-Fehler zum tragen:
No instance for (Show (IO ()))
arising from a use of `print' at <interactive>:1:0-4
Possible fix: add an instance declaration for (Show (IO ()))
In a stmt of a 'do' expression: print it


Ich komm aber nicht drauf, wie ich das mit do lösen kann.
Hoffentlich könnt ihr mir helfen.

Danke im Voraus!
Brewer
Zum Seitenanfang    
 
Siracusa

Gepostet:
26.03.2010 02:53

   
Hallo,

also der Fehler stimmt nicht mit dem Code überein, da du gar kein print verwendest. ;-)

Es funktioniert aber trotzdem nicht, denn main muss vom Typ IO () sein. Bei deinem Code ist f momentan (vereinfacht) vom Typ Int -> IO (), d.h. bei Verwendung von map kommt als Ergebnistyp [IO ()] heraus, was nicht mit IO () zusammenpasst. Wenn du statt map die Funktion mapM_ (hat (vereinfacht) den Typ (Int -> IO ()) -> [Int] -> IO ()) verwendest sollte es funktionieren.

Als Tipp: Schreibe zu jeder Funktionsdefinition zunächst eine Typsignatur, das hilft beim Entwickeln der Funktionen, beim Debuggen und beim späteren Verstehen des Codes.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Brewer

Gepostet:
26.03.2010 11:58

   
Vielen Dank für die schnelle Hilfe!

Mit mapM_ klappt es wunderbar.
Das IO () und [IO ()] nicht zusammen passen, ist mir auch aufgefallen :D Nur hab ich keine Lösung dafür gefunden.
Der print-Fehler kommt übrigens genaus so bei dem Beispiel.

Danke nochmal.
Brewer
Zum Seitenanfang    
 
Siracusa

Gepostet:
27.03.2010 06:36

   
Der print-Fehler kommt übrigens genaus so bei dem Beispiel.

Hä, das wundert mich aber. Smilie Benutzt du Hugs oder den GHC? Und welche Version?
Zum Seitenanfang    
 
Brewer

Gepostet:
27.03.2010 12:47

   
GHCi 6.10.4... sollte die aktuelle sein. Ist im neuesten Haskell Platform 2009.2.0.2 drin.
Zum Seitenanfang    
 
Siracusa

Gepostet:
27.03.2010 14:34

   
Hab's mal mit dem GHCi 6.10.4 probiert. Wenn ich obigen Code lade kommt aber:
Couldn't match expected type `IO t' against inferred type `[IO ()]'
In the expression: main
When checking the type of the function `main'


Allerdings im Interpreter nur [return () :: IO ()] eingeben bringt den gleichen Fehler wie bei dir:
No instance for (Show (IO ()))
arising from a use of `print' at <interactive>:1:0-19
Possible fix: add an instance declaration for (Show (IO ()))
In a stmt of a 'do' expression: print it

Vermutlich ruft der da intern print auf, um das Ergebnis auszugeben.


Viele Grüße,

Siracusa
Zum Seitenanfang