-- 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 
