In-class-3

Class: CSCE-314

-- Step 1: Generate an Arithmetic Sequence (generateSequence)
-- Note you can create a list using [1,3...30]
generateSequence :: Int -> Int -> Int -> [Int]
generateSequence st sp n = [st, st + sp .. n]

-- Step 2: Filter Values Based on a Condition
-- return a list of numbers that are evenly divided by your divisor
filterDivisible :: Int -> [Int] -> [Int]
filterDivisible div (x : xs) = filter (\x -> x `mod` div == 0) (x : xs)
  -- The backslash '\' is “lambda” (function)
  -- 'x' is the parameter to this function.
  -- '-> x' means the function returns 'x'.

-- Step 3: Transform the Values
-- create a function to square a value, 
transformSequence :: [Int] -> [Int]
transformSequence (x : xs) = map (^2) (x : xs)

-- Step 4: Calculate the Sum of the sequence
sumSequence :: [Int] -> Int
sumSequence [] = 0 
sumSequence (x : xs) = x + sumSequence xs
	-- Can also use:
	  -- sumSequence :: [Int] -> Int
	  -- sumSequence (x : xs) = sum

-- Main Program
main :: IO ()
main = do
  putStrLn "Enter the start of the sequence:"
  start <- readLn
  putStrLn "Enter the step size:"
  step <- readLn
  putStrLn "Enter the end of the sequence to generate:"
  n <- readLn

  putStrLn "Enter the divisor for filtering:"
  divisor <- readLn

  -- Generate the sequence
  let sequence = generateSequence start step n
  putStrLn $ "Generated sequence: " ++ show sequence

  -- Filter the sequence
  let filtered = filterDivisible divisor sequence
  putStrLn $ "Filtered sequence (divisible by " ++ show divisor ++ "): " ++ show filtered

  -- Transform the sequence
  let transformed = transformSequence filtered
  putStrLn $ "Transformed sequence (squared values): " ++ show transformed

  -- Calculate the sum
  let sumTransformed = sumSequence transformed
  putStrLn $ "Sum of transformed sequence: " ++ show sumTransformed