<p dir="ltr">I expect it'd be more common to use something like</p>
<p dir="ltr">catchMaybe m $ \e -> guard (isEOFException e) >> return ""</p>
<p dir="ltr">catchJust only makes sense if you not only need the same set of exceptions, but also the same non-trivial calculation based on the exception, for multiple handlers. A hypothetical catchOnly taking a Boolean predicate would make more sense for the case you describe.</p>
<div class="gmail_extra"><br><div class="gmail_quote">On Jul 14, 2016 12:11 PM, "David Menendez" <<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">On Mon, Jul 11, 2016 at 8:23 PM, David Feuer <span dir="ltr"><<a href="mailto:david.feuer@gmail.com" target="_blank">david.feuer@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">The catchJust and handleJust functions seem a bit weird and unidiomatic.</p>
<p dir="ltr">catchJust<br>
        :: Exception e<br>
        => (e -> Maybe b)         -- ^ Predicate to select exceptions<br>
        -> IO a                   -- ^ Computation to run<br>
        -> (b -> IO a)            -- ^ Handler<br>
        -> IO a<br>
catchJust p a handler = catch a handler'<br>
  where handler' e = case p e of<br>
                        Nothing -> throwIO e<br>
                        Just b  -> handler b</p>
<p dir="ltr">This takes two functions and then puts them together. I would think the more natural API would be</p>
<p dir="ltr">catchMaybe :: Exception e => IO a -> (e -> Maybe (IO a)) -> IO a<br>
catchMaybe m handler = catch m handler' where<br>
  handler' e = fromMaybe (throwIO e) (handler e)</p>
<p dir="ltr">This is exactly as powerful as catchJust:</p>
<p dir="ltr">catchMaybe m handler = catchJust handler m id<br>
catchJust p m handler = catchMaybe m $ fmap handler . p</p>
<p dir="ltr">But catchMaybe doesn't enforce the arbitrary separation between "selection" and "handling”.</p>
</blockquote></div><div class="gmail_extra">I wouldn’t call it an arbitrary separation. I imagine that the separation is deliberate, because you will frequently want to catch the same set of exceptions, but want to do different things in different contexts. With the current API, you can write a selector like “fileNotFound” and re-use it with multiple handlers.</div><div class="gmail_extra"><br></div><div class="gmail_extra">In constrast, with a unified seletor/handler you have to write the same code to filter the exceptions you want with every handler which deals with them. You might as well just use catch.</div><div><br></div>-- <br><div data-smartmail="gmail_signature">Dave Menendez <<a href="mailto:dave@zednenem.com" target="_blank">dave@zednenem.com</a>><br><<a href="http://www.eyrie.org/~zednenem/" target="_blank">http://www.eyrie.org/~zednenem/</a>></div>
</div></div>
</blockquote></div></div>