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