annotate exercises/src/Exercise_7.hs @ 17:73170284e009

week 7 tutorial
author Markus Kaiser <markus.kaiser@in.tum.de>
date Fri, 30 Nov 2012 15:18:33 +0100
parents 7acf82c8fb3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
1 {-# LANGUAGE DeriveGeneric #-}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
2 module Exercise_7 where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
3 import Data.List hiding (insert)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
4 import Data.Char
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
5 import Test.QuickCheck
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
6
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
7 {- Library DO NOT CHANGE -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
8 data Tree a =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
9 Empty |
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
10 Node a (Tree a) (Tree a)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
11 deriving (Eq, Show)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
12
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
13 tree = (Node 4
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
14 (Node 2 (Node 1 Empty Empty) (Node 3 Empty Empty))
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
15 (Node 6 (Node 5 Empty Empty) (Node 7 Empty Empty)))
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
16
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
17 insert :: Ord a => a -> Tree a -> Tree a
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
18 insert x Empty = Node x Empty Empty
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
19 insert x (Node a l r)
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
20 | x < a = Node a (insert x l) r
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
21 | a < x = Node a l (insert x r)
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
22 | otherwise = Node a l r
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
23
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
24 data Html =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
25 Text String |
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
26 Block String [Html]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
27
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
28 grueezi =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
29 Block "html"
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
30 [Block "head"
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
31 [Block "author" [Text "der MC"],
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
32 Block "date" [Text "27.11.2012"],
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
33 Block "topsecret" []],
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
34 Block "body"
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
35 [Block "h1" [Text "Gr\252ezi!"],
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
36 Block "p" [Text "\196b\228, genau. Sal\252. Bis sp\246ter!"]]]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
37
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
38 kleiner =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
39 Block "html"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
40 [Block "a"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
41 [Text "Hallo"],
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
42 Block "b"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
43 [Text "du da!"]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
44 ]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
45
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
46 swissLetters :: [(Int, String)]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
47 swissLetters =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
48 [(196, "Auml"), (214, "Ouml"), (220, "Uuml"),
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
49 (228, "auml"), (246, "ouml"), (252, "uuml")]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
50
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
51 data DirTree a =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
52 File a |
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
53 Dir a [DirTree a]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
54 deriving (Eq, Show)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
55
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
56 exDir :: DirTree String
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
57 exDir =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
58 Dir "" [Dir "usr" [Dir "lib" [File "vim"], Dir "include" [File "string.h"]],
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
59 Dir "bin" $ [File "ls", File "cat"]]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
60 {- End Library -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
61
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
62
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
63 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
64 {- Aufgabe G7.1 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
65
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
66 {- 1. -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
67 data WildChar =
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
68 AnyChar |
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
69 AnyString |
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
70 RawChar Char |
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
71 AnyCharIn [Char]
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
72
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
73
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
74 data WildPat =
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
75 WildPat [WildChar]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
76
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
77
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
78 {- 2. -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
79 stringFromWildChar :: WildChar -> String
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
80 stringFromWildChar AnyChar = "?"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
81 stringFromWildChar AnyString = "*"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
82 stringFromWildChar (RawChar c) = [c]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
83 stringFromWildChar (AnyCharIn cs) = "[" ++ cs ++ "]"
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
84
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
85
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
86 stringFromWildPat :: WildPat -> String
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
87 stringFromWildPat (WildPat ws) = concatMap stringFromWildChar ws
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
88
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
89
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
90 {- 3. -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
91 instance Show WildChar where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
92 show = stringFromWildChar
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
93
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
94 instance Show WildPat where
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
95 show = stringFromWildPat
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
96
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
97
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
98 {- 4. -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
99 wildCharsFromString :: String -> [WildChar]
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
100 wildCharsFromString [] = []
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
101 wildCharsFromString (c : cs)
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
102 | c == '?' = AnyChar : ps
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
103 | c == '*' = AnyString : ps
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
104 | c == '[' =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
105 case dropWhile (/= ']') cs of
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
106 [] -> RawChar '[' : ps
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
107 _ : rest -> AnyCharIn (takeWhile (/= ']') cs) :
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
108 wildCharsFromString rest
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
109 | otherwise = RawChar c : ps
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
110 where ps = wildCharsFromString cs
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
111
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
112 wildPatFromString :: String -> WildPat
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
113 wildPatFromString cs = WildPat (wildCharsFromString cs)
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
114
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
115
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
116 {- 5. -}
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
117 -- WildChar und WildPat QuickCheckkompatibel machen
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
118 instance Eq WildChar where
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
119 RawChar c == RawChar c' = c == c'
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
120 AnyChar == AnyChar = True
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
121 AnyString == AnyString = True
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
122 AnyCharIn cs == AnyCharIn cs' = cs == cs'
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
123 _ == _ = False
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
124
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
125 instance Eq WildPat where
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
126 WildPat p == WildPat p' = p == p'
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
127
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
128 instance Arbitrary WildChar where
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
129 arbitrary =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
130 oneof (map return
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
131 (map RawChar "abc?*[]" ++
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
132 [AnyChar, AnyString] ++
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
133 map AnyCharIn ["", "a", "bc", "bbc", "[]", "*?"]))
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
134
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
135 instance Arbitrary WildPat where
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
136 arbitrary =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
137 do ws <- arbitrary
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
138 return $ WildPat ws
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
139
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
140 metas = "?*[]"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
141
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
142 isWildCharSafe (RawChar c) = c `notElem` metas
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
143 isWildCharSafe (AnyCharIn cs) = all (`notElem` metas) cs
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
144 isWildCharSafe _ = True
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
145
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
146 isWildPatSafe (WildPat ws) = all isWildCharSafe ws
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
147
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
148 -- Properties
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
149
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
150 prop_stringFromWildPatFromString s =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
151 stringFromWildPat (wildPatFromString s) == s
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
152
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
153 prop_wildPatFromStringFromWildPat p =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
154 isWildPatSafe p ==> wildPatFromString (stringFromWildPat p) == p
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
155
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
156
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
157 {- 6. -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
158 {-
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
159 G4.4
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
160
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
161 match [] ys = null ys
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
162 match ('?':ps) (y:ys) = match ps ys
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
163 match ('*':ps) [] = match ps []
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
164 match ('*':ps) (y:ys) = match ps (y:ys) || match ('*':ps) ys
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
165 match (p:ps) (y:ys) = p == y && match ps ys
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
166 match ps [] = False
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
167 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
168
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
169 matchWildChars :: [WildChar] -> String -> Bool
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
170 matchWildChars [] ys = null ys
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
171 matchWildChars (AnyChar:ps) (y:ys) = matchWildChars ps ys
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
172 matchWildChars (AnyString:ps) [] = matchWildChars ps []
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
173 matchWildChars (AnyString:ps) (y:ys) = matchWildChars ps (y:ys)
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
174 || matchWildChars (AnyString:ps) ys
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
175 matchWildChars ((AnyCharIn cs):ps) (y:ys) = elem y cs && matchWildChars ps ys
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
176 matchWildChars ((RawChar c):ps) (y:ys) = c == y && matchWildChars ps ys
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
177 matchWildChars ps [] = False
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
178
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
179
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
180 matchWildPat :: WildPat -> String -> Bool
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
181 matchWildPat (WildPat ws) = matchWildChars ws
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
182
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
183 match ps ms = matchWildPat (wildPatFromString ps) ms
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
184
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
185
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
186
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
187 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
188 {- Aufgabe G7.2 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
189
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
190 -- Beispiel für Rekursion über einen binären Suchbaum
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
191 smallest :: Ord a => Tree a -> Maybe a
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
192 smallest Empty = Nothing
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
193 smallest (Node v Empty _) = Just v
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
194 smallest (Node _ l _) = smallest l
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
195
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
196 ---
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
197
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
198 listToSortedTree :: Ord a => [a] -> Tree a
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
199 --listToSortedTree xs = foldl (\tree x -> insert x tree) Empty xs
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
200 listToSortedTree xs = foldl (flip insert) Empty xs
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
201
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
202
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
203 inorder :: Ord a => Tree a -> [a]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
204 inorder Empty = []
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
205 inorder (Node v l r) = inorder l ++ [v] ++ inorder r
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
206
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
207
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
208 treeSort :: Ord a => [a] -> [a]
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
209 treeSort = inorder . listToSortedTree
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
210
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
211 ---
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
212
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
213 -- Properties
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
214 -- treeSort sortiert
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
215 prop_treeSort_isSorted ps =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
216 let ts = treeSort ps in ts == sort ts
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
217
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
218 -- treeSort entfernt keine Elemente
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
219 prop_treeSort_isComplete ps =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
220 eqSet (nub ps) (treeSort ps)
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
221 where
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
222 eqSet xs ys = null (xs \\ ys) && null (ys \\ xs)
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
223
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
224
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
225 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
226 {- Aufgabe G7.3 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
227
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
228 htmlChar :: Char -> String
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
229 htmlChar c
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
230 | o < 128 = [c]
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
231 | otherwise = "&" ++ entity ++ ";"
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
232 where
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
233 o = ord c
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
234 entity =
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
235 case lookup o swissLetters of
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
236 Nothing -> show o
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
237 Just name -> name
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
238
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
239
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
240 plainHtml :: Html -> String
17
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
241 plainHtml (Text cs) = concatMap htmlChar cs
73170284e009 week 7 tutorial
Markus Kaiser <markus.kaiser@in.tum.de>
parents: 16
diff changeset
242 plainHtml (Block name bs) = "<" ++ name ++ ">" ++ concatMap plainHtml bs ++ "</" ++ name ++ ">"
16
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
243
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
244
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
245
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
246 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
247 {- Aufgabe H7.1 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
248
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
249 prettyHtml :: Int -> Html -> String
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
250 prettyHtml = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
251
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
252
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
253
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
254 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
255 {- Aufgabe H7.2 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
256
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
257 plainDirTree :: Show a => DirTree a -> String
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
258 plainDirTree = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
259
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
260
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
261 prettyDirTree :: Show a => DirTree a -> String
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
262 prettyDirTree = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
263
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
264
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
265
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
266 {---------------------------------------------------------------------}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
267 {- Aufgabe H7.3 -}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
268
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
269 {-WETT-}
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
270 unscrambleWords :: [String] -> [String] -> [String]
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
271 unscrambleWords = undefined
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
272 {-TTEW-}