psc-package install return



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.