From f71ef5723fdf4fde57d16f41e696981589d321b6 Mon Sep 17 00:00:00 2001 From: Manuel Thalmann Date: Sat, 15 Jun 2024 18:16:40 +0200 Subject: [PATCH] Add file system template --- Exercises/exercise-3/Filesystem.hs | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Exercises/exercise-3/Filesystem.hs diff --git a/Exercises/exercise-3/Filesystem.hs b/Exercises/exercise-3/Filesystem.hs new file mode 100644 index 0000000..e122449 --- /dev/null +++ b/Exercises/exercise-3/Filesystem.hs @@ -0,0 +1,86 @@ + +{- + Gegeben ist ein einfacher Datentyp für Verzeichnisstrukturen (Ordnerbäume). + Eine Verzeichnisstruktur besteht in diesem Modell entweder aus einem + einzelnen File (durch seinen Namen und Grösse gegeben), oder durch eine Liste + von Unterverzeichnissen. +-} +type Name = String +type FileSizeKB = Int + +data FileSystem + = File Name FileSizeKB + | Dir Name [FileSystem] + deriving Show + +example :: FileSystem +example = Dir "root" + [ Dir "desktop" + [ File "notes.txt" 87 + , File "brochure.pdf" 581 + ] + , Dir "pictures" + [ Dir "holiday2019" + [ File "paris1.png" 2075 + , File "paris2.png" 3017 + ] + , Dir "holiday2018" + [ File "rome1.jpg" 2075 + , File "rome2.jpg" 4584 + , File "rome3.png" 2075 + , File "notes.txt" 112 + ] + ] + ] + + +{- Aufgabe: + implementieren Sie eine "allgemeine fold Funktion" wie in der Vorlesung + besprochen. +-} +filesystem :: (Name -> FileSizeKB -> b) -> (Name -> [b] -> b) -> FileSystem -> b +filesystem file dir fs = error "fixme" + +{- + Ausgehend von der Funktion 'filesystem' wollen wir nun konkrete Funktionen + implementieren, die uns im Umgang mit dem 'FileSystem' Typ nützlich + erscheinen. +-} + +{- Grösse eines Verzeichnisses + Implementieren Sie die Funktion 'size', die die Grösse einer gegebenen + Verzeichnisstruktur zurück gibt. Verwenden Sie die Funktion 'filesystem'. +-} +size :: FileSystem -> Int +size = filesystem (error "fixme") (error "fixme") + +{- Datei abfragen + Implementieren Sie die Funktion 'existsFile', die bei einer gegebenen + Verzeichnisstruktur zurück gibt, ob darin eine Datei mit dem mitgegebenen + Namen zu finden ist. Verwenden Sie die Funktion 'filesystem'. +-} +existsFile :: Name -> FileSystem -> Bool +existsFile name = filesystem (error "fixme") (error "fixme") + +{- Pfade + Ein Pfad ist eine Liste von Namen. + Beispiel: "/pictures/holiday2019/paris1.png" wäre + ["pictures", "holiday2019", "paris1.png"] +-} +type Path = [Name] + +{- Alle Pfade finden + Implementieren Sie die Funktion 'findAll' mit folgendem Verhalten: + Input: Dateiname, Verzeichnisstruktur + Rückgabe: Alle Pfade in der gegebenen Struktur, die auf eine Datei mit dem + gegebenen Namen zeigen. + Verwenden Sie auch hier die Funktion 'filesystem'. +-} +findAll :: Name -> FileSystem -> [Path] +findAll name = filesystem file dir + where + file :: Name -> Int -> [Path] + file n _ = error "fixme" + dir :: Name -> [[Path]] -> [Path] + dir n subs = error "fixme" +