That makes sense, I guess. Something like

data Handle a = Rethrow | Catch (IO a)

I suppose? My names are awful though.


On Jul 14, 2016 12:56 PM, "Oliver Charles" <ollie@ocharles.org.uk> wrote:


On Tue, 12 Jul 2016, 1:23 a.m. David Feuer, <david.feuer@gmail.com> wrote:

The catchJust and handleJust functions seem a bit weird and unidiomatic.

catchJust
        :: Exception e
        => (e -> Maybe b)         -- ^ Predicate to select exceptions
        -> IO a                   -- ^ Computation to run
        -> (b -> IO a)            -- ^ Handler
        -> IO a
catchJust p a handler = catch a handler'
  where handler' e = case p e of
                        Nothing -> throwIO e
                        Just b  -> handler b

This takes two functions and then puts them together. I would think the more natural API would be

catchMaybe :: Exception e => IO a -> (e -> Maybe (IO a)) -> IO a
catchMaybe m handler = catch m handler' where
  handler' e = fromMaybe (throwIO e) (handler e)

A point don't feel super strongly about, but feel I should raise, is that Nothing seems to be somewhat confusing. catchJust (\FileNotFound -> Nothing) seems to suggest that if FileNotFound occurs then nothing will happen, that is - the exception is ignored. However, that is not the case, rather than Nothing happening something certainly happens - an exception is (re)thrown!

Whether or not this confusion is likely to happen in practice I don't know, but it suggests a type isomorphic to Maybe is a better fit.

Ollie