Haskell in eigen map
[f432xdd.git] / fp / 1 / pr1_def.hs
blobecd2ca9c284a0cd60833dee46d1d5419eb976f15
1 module FQL where
3 import List
5 -- Defenities van deze opgave (Gegeven)
7 type Table = [[String]]
9 -- VoorGedefinieerde Tables (Gegeven)
11 compilers :: Table
12 compilers =
13 [ ["Compiler", "Universiteit/bedrijf"]
14 , ["Helium", "Universiteit Utrecht"]
15 , ["NHC", "University of York"]
16 , ["GHC", "Microsoft Research"]
17 , ["Hugs", "Galois Connections"]
18 , ["Hugs.NET", "Galois Connections"]
19 , ["O'Haskell", "Oregon Graduate Institute"]
20 , ["O'Haskell", "Chalmers University of Technology"]
21 , ["HBC", "Chalmers University of Technology"]
23 locaties :: Table
24 locaties =
25 [ ["Universiteit/bedrijf", "Land", "Stad"]
26 , ["Universiteit Utrecht", "Nederland", "Utrecht"]
27 , ["University of York", "Engeland", "York"]
28 , ["Microsoft Research", "Engeland", "Cambridge"]
29 , ["Galois Connections", "Verenigde Staten", "Beaverton"]
30 , ["Oregon Graduate Institute", "Verenigde Staten", "Beaverton"]
31 , ["Chalmers University of Technology", "Zweden", "Goteborg"]
34 ---
35 --- writeTable Functies.
36 ---
38 -- calculateRowLengths
39 -- Bereken de lengtes voor elk element van een lijst van strings.
40 -- @param1 - Lijst van strings waarvan de lengtes moeten worden berekend.
41 -- @output - Lijst van integers van de lengtes van de elementen in param1.
42 calculateRowLengths :: [String] -> [Int]
43 calculateRowLengths (x:xs) = length x : calculateRowLengths xs
44 calculateRowLengths [] = []
46 -- getMaxNumbersOfTwoLists
47 -- Geeft een integer lijst met op elke index de maximale waarde van de invoer lijsten op diezelfde index.
48 -- @param1 - Integer lijst 1
49 -- @param2 - Integer lijst 2
50 -- @output - Lijst van de maximale waardes van elementen van param1 en param2 waarvan de index hetzelfde is.
51 getMaxNumbersOfTwoLists :: [Int] -> [Int] -> [Int]
52 getMaxNumbersOfTwoLists (xa:xsa) (xb:xsb) = max xa xb : getMaxNumbersOfTwoLists xsa xsb
53 getMaxNumbersOfTwoLists [] (x:xs) = x : getMaxNumbersOfTwoLists [] xs
54 getMaxNumbersOfTwoLists (x:xs) [] = x : getMaxNumbersOfTwoLists xs []
55 getMaxNumbersOfTwoLists [] [] = []
57 -- getMaxColumnLengths
58 -- De maximale lengtes per kolom van een tabel.
59 -- @param1 - Tabel waarvan de lengte moet worden berekend.
60 -- @output - Lijst van integers met de maximale lengtes van de kolommen.
61 getMaxColumnLengths :: Table -> [Int]
62 getMaxColumnLengths (x:xs) = getMaxNumbersOfTwoLists (calculateRowLengths x) (getMaxColumnLengths xs)
63 getMaxColumnLengths [] = []
65 -- writeStringNTimes
66 -- Schrijf de invoer string n keer naar de uitvoer string.
67 -- @param1 - Aantal keer dat de string geschreven moet worden.
68 -- @param2 - Invoer string
69 -- @output - Uitvoer string
70 writeStringNTimes :: Int-> String -> String
71 writeStringNTimes n s
72 | n > 0 = concat [s , writeStringNTimes (n - 1) s]
73 | otherwise = ""
75 -- writeTableSeperator
76 -- Schrijf een tussenlijn naar de uitvoer string
77 -- @param1 - Maximale kolom lengtes
78 -- @output - Uitvoer string
79 writeTableSeperator :: [Int] -> String
80 writeTableSeperator (x:xs) = concat ["+", writeStringNTimes x "-", writeTableSeperator xs]
81 writeTableSeperator [] = "+\n"
83 -- writeRow
84 -- Schrijf de inhoud van een rij van de tabel naar de uitvoer string.
85 -- @param1 - De rij die moet worden weergegeven.
86 -- @param2 - De maximale kolom lengtes van de tabel.
87 -- @output - Uitvoer string.
88 writeRow:: [String] -> [Int] -> String
89 writeRow (x:xs) (xa:xsa) = concat ["|", x, writeStringNTimes (xa - length x) " ", writeRow xs xsa]
90 writeRow [] [] = "|\n"
92 -- writeTableContents
93 -- Schrijf de waarden van de tabel naar de uitvoer string.
94 -- @param1 - De tabel.
95 -- @param2 - De maximale kolom lengtes van de tabel.
96 -- @output - Uitvoer string
97 writeTableContents :: Table -> [Int] -> String
98 writeTableContents (x:xs) maxWidths = concat [writeRow x maxWidths, writeTableContents xs maxWidths]
99 writeTableContents [] maxWidths = writeTableSeperator maxWidths
101 -- writeTableHeader
102 -- Schrijf de kop van de tabel naar de uitvoer string.
103 -- @param1 - De waarden van de kop van de tabel.
104 -- @param2 - De maximale kolom lengtes
105 -- @output - Uitvoer string.
106 writeTableHeader:: [String] -> [Int] -> String
107 writeTableHeader header x = concat [writeTableSeperator x, writeRow header x, writeTableSeperator x]
109 -- writeTable
110 -- Schrijf een tabel naar de uitvoer string.
111 -- @param1 - De tabel.
112 -- @output - Uitvoer string.
113 writeTable :: Table -> String
114 writeTable x = concat [writeTableHeader (head x) (getMaxColumnLengths x), writeTableContents (tail x) (getMaxColumnLengths x)]
115 writeTable [] = ""
117 ---
118 --- Project functies
121 -- returnArrayIfFirstElementEqualsString
122 -- Geeft de kolom waarvan het eerste element gelijk is aan die van de invoer
123 -- @param1 - Een ge'transpose'de tabel
124 -- @param2 - De naam van de kolom die gevonden moet worden
125 -- @output - De kolom die gezocht werd
127 returnArrayIfFirstElementEqualsString :: Table -> String -> [String]
128 returnArrayIfFirstElementEqualsString [] x = []
129 returnArrayIfFirstElementEqualsString (x:xs) s
130 | head(x) == s = x
131 | otherwise = returnArrayIfFirstElementEqualsString xs s
133 -- filterColumnNames
134 -- Vind alle kolommen die in de invoer zijn gegeven
135 -- @param1 - Lijst met strings waarvan de kolommen moeten worden geretourneerd
136 -- @param2 - Een ge'transpose'de tabel
137 -- @output - De gefilterde tabel
138 findColumnNames :: [String] -> Table -> Table
139 findColumnNames [] table = []
140 findColumnNames (x:xs) table = returnArrayIfFirstElementEqualsString table x : findColumnNames xs table
142 -- project
143 -- Geeft de opgegeven kolommen van een tabel
144 -- @param1 - De namen van de kolommen die we willen hebben
145 -- @param2 - De invoer tabel
146 -- @output - De uitvoer tabel
147 project :: [String] -> Table -> Table
148 project columns table = transpose (findColumnNames columns (transpose table))
151 --- Select
154 -- getColumnIndex
155 -- Geeft voor een bepaalde string aan welk positie het heeft in de kolom
156 -- @param1 - Invoer kolom
157 -- @param2 - Invoer string
158 -- @output - Index van de string in de kolom
159 getColumnIndex :: [String] -> String -> Int
160 getColumnIndex (x:xs) s
161 | x == s = 0
162 | otherwise = 1 + getColumnIndex xs s
164 -- getColumnFromRowByIndex
165 -- Geeft van een rij de juiste kolom aan de hand van een index
166 -- @param1 - Invoer rij
167 -- @param2 - Index
168 -- @output - De string die op de positie van de index in de kolom staat
169 getColumnFromRowByIndex :: [String] -> Int -> String
170 getColumnFromRowByIndex (x:xs) idx
171 | idx == 0 = x
172 | otherwise = getColumnFromRowByIndex xs (idx-1)
174 -- ifCondition
175 -- Geeft alle waardes in een bepaalde rij die voldoen aan een bepaalde voorwaarde
176 -- @param1 - Invoer tabel
177 -- @param2 - Voorwaarde
178 -- @param3 - Kolom index
179 -- @output - Tabel met slechts de rijen die voldoen aan de voorwaarde
180 ifCondition :: Table -> (String->Bool) -> Int -> Table
181 ifCondition (x:xs) c i
182 | c (getColumnFromRowByIndex x i) = x : ifCondition xs c i
183 | otherwise = ifCondition xs c i
184 ifCondition [] c i = []
186 -- select
187 -- Selecteer een aantal rijen op basis van een voorwaarde
188 -- @param1 - Naam van de kolom die doorzocht moet worden
189 -- @param2 - Voorwaarde voor het selecteren van de rijen
190 -- @param3 - Invoer tabel
191 -- @output - Uitvoer tabel
192 select :: String -> (String -> Bool) -> Table -> Table
193 select s c (x:xs) = x : ifCondition xs c (getColumnIndex x s)
196 --- Join functies
197 ---
199 -- containsColumn
200 -- Bevat een opgegeven rij een string?
201 -- @param1 - Lijst van strings
202 -- @param2 - De te vinden string
203 -- @output - True of False.
204 containsColumn :: [String] -> String -> Bool
205 containsColumn (x:xs) s
206 | x == s = True
207 | otherwise = containsColumn xs s
208 containsColumn [] s = False
210 -- findCommonFieldIndexInFirstRow
211 -- Vind 2 gelijke kolommen in twee rijen.
212 -- @param1 - Rij 1
213 -- @param2 - Rij 2
214 -- @Output - (x1,x2) waar x1 de index is van de gemeenschappelijke kolom in Rij 1 en x2 de index van de gemeenschappelijke kolom van Rij 2.
215 findCommonFieldIndexInFirstRow :: [String] -> [String] -> (Int,Int)
216 findCommonFieldIndexInFirstRow (x:xs) row2
217 | containsColumn row2 x = (0, getColumnIndex row2 x)
218 | otherwise = z where (x1,x2) = findCommonFieldIndexInFirstRow xs row2; z = (x1+1,x2)
220 -- findMatch
221 -- Retourneert
222 findMatch :: Table -> String -> Int -> [String]
223 findMatch (x:xs) value idx
224 | (getColumnFromRowByIndex x idx) == value = x
225 | otherwise = findMatch xs value idx
226 findMatch [] value idx = []
228 -- addRowsIfNotNull
229 -- Retourneert een rij die is samengevoegd uit rij1 en rij 2 indien zowel rij1 en rij 2 geen lege reeksen zijn
230 -- @param1 - Rij 1
231 -- @param2 - Rij 2
232 -- @output - concat [a,b] als a.length > 0 en b.length > 0
233 addRowsIfNotNull :: [String] -> [String] -> [String]
234 addRowsIfNotNull [] [] = []
235 addRowsIfNotNull a [] = []
236 addRowsIfNotNull b [] = []
237 addRowsIfNotNull a b = concat [a, b]
239 -- removeColumnFromRowByIndex
240 -- verwijdert de opgegeven kolom uit de lijst.
241 -- @param1 - de lijst.
242 -- @param2 - Index van te verwijderen kolom.
243 -- @output - String lijst met de kolom van param2 verwijdert.
244 removeColumnFromRowByIndex :: [String] -> Int -> [String]
245 removeColumnFromRowByIndex (x:xs) idx
246 | idx == 0 = removeColumnFromRowByIndex xs (idx-1)
247 | otherwise = x : removeColumnFromRowByIndex xs (idx-1)
248 removeColumnFromRowByIndex [] idx = []
251 -- removecolumnFromTableByIndex
252 -- Verwijdert een opgegeven kolom van de tabel.
253 -- @param1 - De tabel waaruit de kolom moet worden verwijdert
254 -- @param2 - De Index van de Kolom die moet worden verwijdert uit de rijen.
255 -- @output - De tabel van param1 zonder de kolom van param2
256 removeColumnFromTableByIndex :: Table -> Int -> Table
257 removeColumnFromTableByIndex (x:xs) idx = removeColumnFromRowByIndex x idx : removeColumnFromTableByIndex xs idx
258 removeColumnFromTableByIndex [] idx = []
261 -- recJoin
262 -- Recursieve body van Join. retourneert een tabel van samengevoegde rijen.
263 -- Indien de waarde van de gemeenschappelijke kolom van tabel 1
264 -- voorkomt in de kolom van een van de rijen van tabel 2 worden deze 2 rijen samengevoegd en geretourneerd.
265 -- @param1 - Table 1
266 -- @param2 - Table 2
267 -- @param3 - (Index of common row in table1, Index of common row in table2)
268 -- @output - De samengevoegde tabel van Table1 en Table2
269 recJoin :: Table -> Table -> (Int,Int) -> Table
270 recJoin (x:xs) table2 (idx1,idx2) = concat [[addRowsIfNotNull x (findMatch table2 (getColumnFromRowByIndex x idx1) idx2)], recJoin xs table2 (idx1,idx2)]
271 recJoin [] table2 (idx1,idx2) = []
274 -- Join
275 -- @param1 - Tabel 1
276 -- @param2 - Tabel 2
277 -- @output - retourneerd tabel 1 + tabel 2 samengevoegd tot 1 tabel
278 join :: Table -> Table -> Table
279 join table1 table2 = z where (x1,x2) = findCommonFieldIndexInFirstRow (head table1) (head table2); z = removeColumnFromTableByIndex (recJoin table1 table2 (x1,x2)) x1