1 --!!! runST (the classic rank 2 type example)
3 newtype ST s a = MkST (s -> (a,s))
5 unST :: ST s a -> (s -> (a,s))
8 runST :: (forall s. ST s a) -> a
9 runST m = case unST m () of { (a,_) ->
13 returnST :: a -> ST s a
14 returnST a = MkST (\s -> (a,s))
16 thenST :: ST s a -> (a -> ST s b) -> ST s b
17 thenST m k = MkST (\ s0 -> case unST m s0 of { (a,s1) -> unST (k a) s1 })
19 instance Monad (ST s) where