Discussion: add more idiomatic versions of catchJust and/or handleJust

David Feuer david.feuer at gmail.com
Thu Jul 14 17:10:10 UTC 2016


I expect it'd be more common to use something like

catchMaybe m $ \e -> guard (isEOFException e) >> return ""

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.

On Jul 14, 2016 12:11 PM, "David Menendez" <dave at zednenem.com> wrote:

> On Mon, Jul 11, 2016 at 8:23 PM, David Feuer <david.feuer at 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)
>>
>> This is exactly as powerful as catchJust:
>>
>> catchMaybe m handler = catchJust handler m id
>> catchJust p m handler = catchMaybe m $ fmap handler . p
>>
>> But catchMaybe doesn't enforce the arbitrary separation between
>> "selection" and "handling”.
>>
> 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.
>
> 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.
>
> --
> Dave Menendez <dave at zednenem.com>
> <http://www.eyrie.org/~zednenem/>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160714/596db68e/attachment.html>


More information about the Libraries mailing list