sales i = iterate (\i -> 1 + 7 * i `mod` 1001) 3 !! (i - 1)
-- details of this definition are not important!
-----------------------------------------
-- Introduction to Functional Programming
-- 3A List continued: list comprehensions
-- David Sands
-- Weekly sales from a shop, week numbers start at zero
-- sales i is the sales for week i.
-- Assume week (Int) is positive (> 0).
-- Result is always non-negative
type Week = Int
type Sales = Integer
sales :: Week -> Sales -- definition not important
-- (1) total sales for the first n weeks?
total :: Week -> Sales
total n = sum (allSales n)
-- (2) highest sale in the first n weeks?
highest :: Week -> Sales
highest n = maximum (allSales n)
allSales :: Week -> [Sales]
allSales n = [sales w | w <- [1..n]]
-- (3) number of weeks with sales less than 100
-- in the first n weeks.
numBadWeeks :: Week -> Int
numBadWeeks n = length [ s | s <- allSales n, s < 100]
-- Exercise: solve these with recursion, without using lists
-- (4) Compute a table of week number and sales up to week n.
table :: Week -> [(Week,Sales)]
-- table n = [(w,sales w) | w <- [1..n]]
table n = zip [1..] (allSales n)
-- broken! [(w,s) | s <- allSales n, w <- [1..n]]
-- (4) Give the week number of the week with the best sales in the first n weeks.
-- (5) Write a quickcheck property for (4)
-- (6) Hard Exercise
-- Compute the longest number of consecutive weeks with
-- sales less than 100 (in the weeks up to and including week n).
-- (7) Make a table for all the sales upto week n