module StateMonad () where type State = Int data ST a = S (State -> (a, State)) {-@ data ST a <p1 :: State -> Bool, p2 :: State -> Bool> = S (x::(f:State<p1> -> (a, State<p2>))) @-} {-@ fresh :: ST <{\v -> v>=0}, {\v -> v>=0}> Int @-} fresh :: ST Int fresh = S $ \n -> (n, n-1)