Hi,
Rather than using indexing, or using head, I recommend using pattern matching. These functions are not total, i.e. they fail to provide a valid result for some specific inputs, like head on empty list.
The following is similar to replicateM from Control.Monad, you can either modify it to suit your need, or use replicateM combined with map to turn a list of Strings to a list of IO () as required by replicateM.
execNTimes :: Int -> [IO ()] -> IO ()
execNTimes 0 [] = return ()
execNTimes n (x : xs)
| n <= 0 = return ()
| otherwise = x >> execNTimes (n - 1) xs
Where, the following are equivalent:
a >> b == do a
b