UPenn Homework 3: skips function
The Lecture Notes advocate "wholemeal" programming, which I would summarize as being the use of higher-order functions.  Your code, on the other hand, suffers from the "indexitis" that you are being encouraged to avoid.

The key insight for this exercise is that it resembles a list-chunking problem.  If you transform "hello!" into, say, chunks of increasing length…

[
    ["h", "e", "l", "l", "o", "!"],
    ["he", "ll", "o!"],
    ["hel", "lo!"],
    ["hell"],
    ["hello"],
    ["hello!"]
]


… then the problem boils down to taking the last element of each substring.

skips :: [a] -&gt; [[a]]
skips xs =
  map (map last . fullChunks) $ zip [1..] (replicate (length xs) xs)
  where
    fullChunks (n, ys)
      | n &gt; length ys = []     -- Discard incomplete chunks
      | otherwise     = chunk : fullChunks (n, rest)
      where (chunk, rest) = splitAt n ys


Unfortunately, you can't use the functions provided by Data.List.Split, since incomplete chunks at the end need to be discarded.