Github: RepeatArrayElements.hs We’ll explore some ways to carry out some List operations in Hasell.
Specifically, we’ll write functions that repeat each element of a list a specific (n) number of times.

Our function signature. They take in an integer n and a List of integers, and return a list of integers.

type RepElms = Int -> [Int] -> [Int]

Doing it Bottom-Up

rep :: Int -> Int -> [Int]
rep n x =
  if n == 1
    then [x]
    else x : rep (n-1) x
  • Using Recursion
f :: RepElms
f _ [] = []
f n (x:xs) =
  if null xs
    then rep n x
  else rep n x ++ f n xs
  
f 3 [2,4,6,8,10,12,14]
[2,2,2,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14]
  • Using replicate
f2 :: RepElms
f2 _ [] = []
f2 n (x:xs) =
  if null xs
    then replicate n x
  else rep n x ++ f2 n xs

f2 2 [1,5,9]
[1,1,5,5,9,9]

Using concatMap with replicate

f3 :: RepElms
f3 n = concatMap (replicate n)

f3 4 [2,4]
[2,2,2,2,4,4,4,4]
f5 :: RepElms
f5 = concatMap . replicate

f5 2 [9, 10]
[9,9,10,10]
f6 :: RepElms
f6 n arr = arr >>= replicate n

f6 5 [5, 6]
[5,5,5,5,5,6,6,6,6,6]

Using Nested ListComps

f4 :: RepElms
f4 n arr =
  [num | num <- arr, _ <- [1..n]]
  
f4 3 [7, 4]
[7,7,7,4,4,4]