Return introduces a new data type
data Return a
= Cont a
| Return a
and a function
mkReturnable :: ∀ a. ((Return a -> a) -> a) -> a
Using mkReturnable
you can create functions that "return" values early in a way that you normally would have to use explicit recursion to accomplish.
For example:
foldl' :: ∀ a b f. Foldable f => (b -> a -> Return b) -> b -> f a -> b
foldl' f init as = mkReturnable \return -> foldl (\b a -> return $ f b a) init as
This is nice because it allows for you to define, for fee, folds that can exit early for anything that already has a Foldable
instance, instead of having to use recursion to handle each case differently.