Add file system template
This commit is contained in:
parent
4580f58d9a
commit
f71ef5723f
86
Exercises/exercise-3/Filesystem.hs
Normal file
86
Exercises/exercise-3/Filesystem.hs
Normal file
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue