5 -- Defenities van deze opgave (Gegeven)
7 type Table
= [[String]]
9 -- VoorGedefinieerde Tables (Gegeven)
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"]
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"]
35 --- writeTable Functies.
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
[] = []
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
72 | n
> 0 = concat [s
, writeStringNTimes
(n
- 1) s
]
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"
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"
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
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
]
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
)]
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
131 |
otherwise = returnArrayIfFirstElementEqualsString xs s
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
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
))
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
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
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
172 |
otherwise = getColumnFromRowByIndex xs
(idx
-1)
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
= []
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
)
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
207 |
otherwise = containsColumn xs s
208 containsColumn
[] s
= False
210 -- findCommonFieldIndexInFirstRow
211 -- Vind 2 gelijke kolommen in twee rijen.
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
)
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
= []
229 -- Retourneert een rij die is samengevoegd uit rij1 en rij 2 indien zowel rij1 en rij 2 geen lege reeksen zijn
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
= []
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.
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
) = []
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