Hello everyone

In C you can't implement main loop with recursion like
void mainLoop() {
  doSomething();
  mainLoop();
}  
because without optimisations stack will overflow.
In haskell it's common to write
mainLoop = doSomething >> mainLoop, and it doesn't leak memory because of haskell's evaluation model.
Does memory leak or argument stack overflow happen in this case?
mainLoop = doSomething >> mainLoop >> exit ExitSuccess
What about this case?
mainLoopModeA = do
  doSomething
  when condition mainLoopModeB
  mainLoopModeA
mainLoopModeB = do
  doSomethingElse
  when anotherCondition mainLoopModeA
  mainLoopModeB

or this case?
mainLoopModeA = do
  doSomething
  if condition
    then mainLoopModeB
    else mainLoopModeA
mainLoopModeB = do
  doSomethingElse
  if anotherCondition 
    then mainLoopModeA
    else mainLoopModeB

--
Nikita Fufaev