Overloading Side-Effects
Why should we choose between IO and ST when we want side-effects?
class Monad m => RefMonad m r | m -> r where
writeRef :: r a -> a -> m ()
instance RefMonad IO IORef …
instance RefMonad (ST s) (STRef s) …
Partial type application.
for m and r in the types…