+ r <- p bi env
+ case r of
+ Yes env' x -> runVM (f x) bi env'
+ No -> return No
+
+noV :: VM a
+noV = VM $ \bi env -> return No
+
+tryV :: VM a -> VM (Maybe a)
+tryV (VM p) = VM $ \bi env -> do
+ r <- p bi env
+ case r of
+ Yes env' x -> return (Yes env' (Just x))
+ No -> return (Yes env Nothing)
+
+maybeV :: VM (Maybe a) -> VM a
+maybeV p = maybe noV return =<< p