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 ()
data RList r a = Nil | Cons a (r (RList r a))
insertRList :: (Ord a, RefMonad m r) =>
a -> r (RList r a) -> m ()