Always fun to see this type of thing implemented in Haskell.
Here are some other examples.
This one uses indexed monads to keep the instruction stream correct:
https://intoverflow.wordpress.com/2010/05/21/announcing-pote...
And this one is very similar to the OP but from 2013, and emits 6502 assembly: http://wall.org/~lewis/2013/10/15/asm-monad.html (of course without the JIT portion).