www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Viviane

Gepostet:
18.03.2011 18:22

Bild um 90 Grad drehen  
 type Picture = [[Char]]

lis :: Picture -> [Char]
lis [] = []
lis pic = [head (last pic)] ++ lis (init pic)

lis2 :: Picture -> Picture
lis2 [] = []
lis2 pic = [tail x | x<-pic]

rotate90 :: Picture -> Picture
rotate90 [] = []
rotate90 pic = [(lis pic)] ++ rotate90 (lis2 pic)




lis und lis2 funktionieren, rotate90 gibt eine Fehlermeldung, dass die leere Liste nicht abgefangen würde.
Warum? Wird sie doch jeweils.

Zur Erläuterung: lis bekommt eine Liste von Strings und gibt einen String zurück der nur aus den Listenköpfen besteht, und zwar von hinten nach vorne
lis2 bekommt eine Liste von Strings (Picture) und liefert ein neues Picture zurück, dass nur aus den Listenschwänzen besteht.
rotate90 wendet lis auf das ganze Picture an, liefert also ein Picture zurück das so aussehen müsste:
rotate90 ["abcd", "efgh"] = ["ea" ,"fb", "gc", "hd"],

Das funktioniert auch, nur dass eben am Schluss die Fehlermeldung kommt, die leere Liste sei nicht abgefangen.

Grüße

Viviane
Zum Seitenanfang ICQ    
 
Viviane

Gepostet:
19.03.2011 13:02

   
Die Fehlermeldung die kommt ist Prelude.head: empty list.

Und zwar nach dem all das ausgegeben wurde was ich eigentlich haben wollte, bedeutet rotate90 terminiert nur nicht richtig. Ich komme nur nicht drauf wieso, hat jemand einen Tipp?
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
19.03.2011 17:39

   
Hallo,

die einzige Stelle wo ein head steht ist in [head (last pic)], wenn last pic leer ist kommt der Fehler.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Viviane

Gepostet:
19.03.2011 18:26

   
Mal durchgegangen. Hm. Ich glaube ich habe es.

Sieht so aus wie vorher, nur eben rotate90 sieht jetzt so aus:

rotate90 :: Picture -> Picture
rotate90 [] = []
rotate90 ["" ,""] = []
rotate90 pic = [(lis pic)] ++["\n"] ++ rotate90 (lis2 pic)

Wie lässt sich erklären, dass das aufgeht obwohl ich doch in der einen Funktion wo der Kopf drin vorkommt gar nichts verändert habe?

Danke

Viviane
Zum Seitenanfang ICQ    
 
Viviane

Gepostet:
22.03.2011 11:18

   

Soooo abgeändert:


lis :: Picture -> [Char]
lis [] = []
lis pic = if (head pic) /= "" then [head (last pic)] ++ lis (init pic) else lis []


lis2 :: Picture -> Picture
lis2 [] = []
lis2 pic = if (last pic) /= "" then [tail x | x<-pic] else lis2 []

rotate90 :: Picture -> Picture
rotate90 [] = []
rotate90 ["" ,""] = []
rotate90 pic = [(lis pic)] ++ rotate90 (lis2 pic)

putpic :: Picture -> IO ()
putpic [] = putStr ""
putpic ["" ,""] = putStr ""
putpic pic = putStr (head pic) >> putStr "\n" >> putpic (tail pic)

r2 :: Picture -> IO ()
r2 pic = putpic (rotate90 pic )




Das Funktioniert auch in der Ausgabe wunderbar und so wie es soll nur: Wenn ich direkt rotate90 benutze sieht zum Beispiel rotate90 ["aa","bb"] so aus: "ba", "ba", ""].

Mir ist schon klar dass das daran liegt dass ich da oben bei lis und lis2 noch eine leere Liste zufüge nur: Gibt es auch irgendeine Möglichkeit ins Programm zu schreiben dass es einfach gar nichts zufügen soll?

Grüße

Viviane
Zum Seitenanfang ICQ    
 
Viviane

Gepostet:
23.03.2011 00:51

   
Erledigt.
Zum Seitenanfang ICQ