calcSum11 n x y = sum (map (\i -> x^i * y^(n-i)) [1..n]) calcSum12 n x y = sum [ x^i * y^(n-i) | i <- [1..n] ] -- bonus: calcSum1 with foldr: -- calcSum13 n x y = foldr ? 0 [1..n] -- template: sum (map (\i -> ?) [1..n]) -- template: sum [ ? | i <- [1..n] ] calcSum21 n m x y = sum (map (\i -> product (map (\j -> x^i - y^j) [i..m])) [1..n]) calcSum22 n m x y = sum (map f [1..n]) where f i = product (map (g i) [i..m]) g i j = x^i - y^j calcSum23 n m x y = sum (map f [1..n]) where f i = product (map g [i..m]) where g j = x^i - y^j type Grade = (Int, String, Double) type DB = [Grade] db :: DB db = [(40000, "DS", 5.25), (40000, "FP", 6.00), (40001, "FP", 3.50)] averageGrade :: DB -> Double averageGrade db = average [ grade | (_, _, grade) <- db ] average l = sum l / fromIntegral (length l) removeDuplicates [] = [] removeDuplicates (x:xs) | elem x xs = removeDuplicates xs | otherwise = x:removeDuplicates xs -- bonus: removeDuplicates with foldr: -- removeDuplicates l = foldr ? ? l listStudents :: DB -> [Int] listStudents db = removeDuplicates [ student | (student,_,_) <- db] averageStudentGrade :: DB -> Int -> Double averageStudentGrade db fn = average [ grade | (student,_,grade) <- db, student == fn] allStudentsAverages db = [ (averageStudentGrade db fn, fn) | fn <- listStudents db] bestStudent db = snd (maximum (allStudentsAverages db))