I'm implementing a partial emulator for Sitara PRU. Instead of using explicit state update functions s->s, I'm using a state monad :: m (). Because of (), this seems not necessary. However, it is still useful because intermediate computations used to implement the instructions can still return values inside the monad, such as e.g. a register lookup function :: m Int.