You can very easily define a function to help you write things that look like imperative loops:
import Control.Monad
loop :: Monad m => [i] -> a -> (i -> a -> m a) -> m a
loop is a0 f = foldr (>=>) return (map f is) a0
The definition is not really important (many, many ways to write this function), rather, to understand what it does, look at the type. Given some list of i - the range of values to loop over, and some initial value for your loop, an a, and finally, a function which given a value (i) and a loop state (a), returns a new loop state in some context m. This function produces a computation in that context m which yields the last state.
Use it simply like so:
import System.Environment
main = do
(c0:c1:c2:c3:_) <- map read <$> getArgs
loop [1..100] (0,0) $ \count (x,y) -> do
print (count,x,y)
let z = -(c0*x + c1*y)/c2 - c3
return (x+y,y+z)
and
> runghc test.hs 12 34 56 78
(x, y)and returns two variables(x', y'). Your loop is then that function applied to its own output 100 times.