module NonDet where data L e a = Failure (Maybe e) | Success a (L e a) deriving Show unitL :: a -> L e a unitL a = Success a (Failure Nothing) (Failure _) `appendL` xs = xs Success x xs `appendL` ys = Success x (xs `appendL` ys) bindL :: L e a -> (a -> L e b) -> L e b (Success a es) `bindL` k = k a `appendL` (es `bindL` k) (Failure e) `bindL` k = Failure e failL :: e -> L e a failL e = Failure (Just e) tryL :: L e a -> (Maybe e -> L e a) -> L e a tryL (Success v vs) h = Success v (tryL vs h) tryL (Failure e) h = h e toList :: L e a -> [a] toList (Success x xs) = x : toList xs toList _ = []