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

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


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 at ocharles.org.uk> wrote:

>
>
> On Tue, 12 Jul 2016, 1:23 a.m. 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)
>>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160714/adf7b96d/attachment-0001.html>


More information about the Libraries mailing list