Yraglac's transit woes
You have the right idea here by replacing an imperative loop with recursion. 

The main improvement I would suggest is that in firstStop you are simulating waiting for the bus i minutes at a time instead of calculating how long to wait. The formula I came up with for that is (renaming i to interval as below):

where
  remainder = current `rem` interval
  firstStop =
    case remainder of
        0 -&gt; remainder
        x -&gt; interval - remainder


e.g. if we're at time 26 and interval = 5 then remainder is 1 and interval - remainder is 4 which correct since we need to wait until time 30. The exception is for when the wait time is 0, in which case interval - remainder would tell us 5 instead of 0, so I wrote out a case expression for that.



There are some Haskell practices you could do better. For example, head and tail are discouraged when you can use pattern matching instead. Here's one refactoring you could do:

calcTime :: Integer -&gt; [Integer] -&gt; [Integer] -&gt; Integer
calcTime current [] intervals = current
calcTime current (travelTime:travelTimes) (interval:intervals) =
    calcTime (firstStop + travelTime) travelTimes intervals
        where firstStop = ...