module ST where type ST s a = s -> (a, s) unitST :: a -> ST s a unitST a = \ s -> (a, s) bindST :: ST s a -> (a -> ST s b) -> ST s b m `bindST` k = \ s0 -> let { (a, s1) = m s0 } in k a s1 setXST :: x -> ST (x, y) () setXST v = \ (x, y) -> ((), (v, y)) setYST :: y -> ST (x, y) () setYST v = \ (x, y) -> ((), (x, v)) getXST :: () -> ST (x, y) x getXST () = \ (x, y) -> (x, (x, y)) getYST :: () -> ST (x, y) y getYST () = \ (x, y) -> (y, (x, y))