www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

tregi

Gepostet:
19.01.2007 10:37

Haskell IO File Operationen: (FilePath-> IO ()), doesDirectoryExist  
Hallo
Ich habe 2 Probleme im bezug auf Haskell und IO:#

1. Als erstes habe ich folgende Signatur vorgegeben:
traverse:: FilePath -> (FilePath-> IO ())-> IO ()

Diese soll von einem Bestimmten Anfangsordner alle Dateien und UnterOrdner zurückgeben.
Man gößtes Problem ist (FilePath-> IO ()) wie übergebe ich ich soetwas und wie werte ich es aus ?

2. Desweiteren benötige ich eine Funktion die Prüft ob eine FilePath ein Ordner ist.

isDir :: FilePath -> IO Bool
isDir file = do ergeb <- doesDirectoryExist file
print ergeb

Also soweit bin ich schon. Blos wie kann ich jetzt Prüfen ob dieses Ergebnis True oder False ist? bzw. die Rückgabe schon vorher in eine normalen Bool umwandeln ? Also dann isDir :: FilePath -> Bool ?



Zum Seitenanfang    
 
Siracusa

Gepostet:
19.01.2007 19:34

   
Hallo,

dann geb ich mal ein paar Hinweise.

zu 1.) Der zweite Parameter der traverse-Funktion soll wahrscheinlich eine Funktion sein, auf die jeder gefundene Datei-Eintrag angewendet werden soll. Dann ist bswp. ein Aufruf wie

traverse "C:\\Programme" print

möglich, der einfach alle gefundenen Einträge ausgibt. Das sieht im Code dann etwa so aus:
traverse startFile traverseFunction = do
...
foundFile <- ... -- Liefere Dateieintrag
traverseFunction foundFile -- Datei auf die Funktion anwenden
...


zu 2.) Eine Funktion zu schreiben, die aus IO Bool ein Bool macht wird dir nicht gelingen. Da du den Rückgabewert einer IO-Aktion (z.B. doesDirectoryExist file) nur wieder innerhalb einer IO-Aktion auslesen kannst, muß auch das Funktionsergebnis wieder eine IO-Aktion sein. Diese kann aber wieder einen Rückgabewert enthalten (hier: Bool), wie in der Signatur angegeben. Du brauchst also nur das print in deiner Funktion durch ein return ersetzen, damit die Funktion korrekt läuft.
Das return macht lediglich aus einem Bool-Wert eine IO-Aktion, die einen Bool-Wert als Rückgabewert liefert.
Zum Seitenanfang    
 
tregi

Gepostet:
20.01.2007 11:45

   
Hallo
Schonmal danke für deine Hilfe.
Ist es dann andererseits möglich einene Bool in einene IO Bool zu konvertieren. Und ist es dann möglich 2 IO Bools zu vergleichen?
Zum Seitenanfang    
 
Siracusa

Gepostet:
20.01.2007 17:38

   
Ja, die Konvertierung das macht das return. Ein Beispiel:

equalsIO :: IO Bool -> IO Bool -> IO Bool
equalsIO aIO bIO = do
a <- aIO -- 1. Bool aus dem IO Bool lesen
b <- bIO -- 2. Bool aus dem IO Bool lesen
return (a == b) -- Ergebnis (vom Typ Bool) als neuen IO Bool zurückgeben

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
tregi

Gepostet:
22.01.2007 22:23

   
Hallo nochmal
Erstmal vielen Dank! Das Problem mit den IO Bools ist erledigt.
Ic habe jedoch noch ein Problem mit dem traverse. Wie übergebe ich der traverse die Paramater inklusive der Parameter für die Unterfunktion (also die traverseFunction)? Ich habe schon einiges versucht bekomme jedoch nur Fehler.
Zum Seitenanfang    
 
Siracusa

Gepostet:
23.01.2007 20:31

   
Poste mal deinen bisherigen Stand, damit man sehen kann wo der Fehler liegt.

Ansonsten verstehe ich die Frage nicht, Parameter übergibst du einfach, indem du sie hinter die Funktion schreibst. Und nicht die Parameter für die traverseFunction sollen an die traverse übergeben werden, sondern nur die traverseFunction selbst. Beim Aufruf der traverseFunction innerhalb der traverse werden dann dort lokal Parameter übergeben.
Zum Seitenanfang