second :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 0/0 rules
-- looking through 0 candidates of size 1
-- looking through 1 candidates of size 2
-- looking through 1 candidates of size 3
second xs = head (tail xs)
third :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 0/0 rules
-- looking through 0 candidates of size 1
-- looking through 1 candidates of size 2
-- looking through 1 candidates of size 3
-- looking through 1 candidates of size 4
third xs = head (tail (tail xs))
sum :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 14/25 rules
-- looking through 2 candidates of size 1
-- looking through 4 candidates of size 2
-- looking through 3 candidates of size 3
-- looking through 13 candidates of size 4
-- looking through 14 candidates of size 5
sum [] = 0
sum (x:xs) = x + sum xs
product :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 14/25 rules
-- looking through 2 candidates of size 1
-- looking through 4 candidates of size 2
-- looking through 3 candidates of size 3
-- looking through 13 candidates of size 4
-- looking through 14 candidates of size 5
product [] = 1
product (x:xs) = x * product xs
sum :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 15/26 rules
-- looking through 2 candidates of size 1
-- looking through 4 candidates of size 2
-- looking through 3 candidates of size 3
-- looking through 16 candidates of size 4
sum xs = foldr (+) 0 xs
product :: [Int] -> Int
-- testing 360 combinations of argument values
-- pruning with 15/26 rules
-- looking through 2 candidates of size 1
-- looking through 4 candidates of size 2
-- looking through 3 candidates of size 3
-- looking through 16 candidates of size 4
product xs = foldr (*) 1 xs