I am a Haskell beginner. I've tried to write a tiny VM-like thing but ran into a problems with IO and evaluation order.

Here is the full source code of this VM: https://gist.github.com/mamontov-cpp/c4d8e2e46e7541c0c646 . This code is supposed to read 4 strings and output them in reverse order.

While it seems to read some strings, it requests much more than one string from user on each step of evaluation of meta-program, stored as array in main function (which is just wrong).

I assume the problem with this program, is that the main state, being immutable, seems to get re-evaluated on several steps inside of internal parts of runProgram and runInstructionOrStop, forcing it to repeat requesting data from user.

So, how can I prevent this main state from being re-evaluated in following code ? Or is there any other problems, which I don't see?