-- Sum of squares of even numbers; Several variants -- Input: list of integers -- Output: sum over the squares of all even numbers in the input list -- -- See slides http://www.macs.hw.ac.uk/~hwloidl/Courses/F21DP/l16_handout.pdf -- -- Launch interpreter: ghci sqs.hs -- Then test like this: sqs_even [1..10] ----------------------------------------------------------------------------- module Main where import System.Environment import Data.List -- using explicit recursion sqs_even :: [Integer] -> Integer sqs_even [] = 0 sqs_even (x:xs) | even x = x^2 + sqs_even xs | otherwise = sqs_even xs -- using a list comprehension and prelude sum sqs_even1 :: [Integer] -> Integer sqs_even1 xs = sum [x*x | x <- xs, even x] -- using higher-order functions sqs_even2 :: [Integer] -> Integer sqs_even2 xs = sum (map (\ x -> x*x) (filter even xs)) -- using higher-order functions sqs_even3 :: [Integer] -> Integer sqs_even3 = foldr (+) 0 . map (\ x -> x*x) . filter even -- using higher-order functions and sections sqs_even4 :: [Integer] -> Integer sqs_even4 = foldr (+) 0 . map (^2) . filter even -- as above, but generating list from an integer sq_even :: Integer -> Integer sq_even n = sum $ map (^2) $ filter even $ [1..n] -- as above, but generating list from an integer sq_even1 :: Integer -> Integer sq_even1 = sum . map (^2) . filter even . enumFromTo 1