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

Oliver Charles ollie at ocharles.org.uk
Thu Jul 14 21:42:24 UTC 2016


data ExceptionHandler a = Rethrow | HandleException (IO a)

would be my offering of paint.

On Thu, Jul 14, 2016 at 9:52 PM David Feuer <david.feuer at gmail.com> wrote:

> Handle is no good because it clashes with file handles. How about Reaction?
>
> On Jul 14, 2016 1:53 PM, "Andreas Abel" <andreas.abel at ifi.lmu.de> wrote:
>
>> Maybe rather
>>
>>   data Handle a = Rethrow | Handle (IO a)
>>
>> !?
>> On 14.07.2016 19:12, David Feuer wrote:
>>
>>> 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
>>> <mailto:ollie at ocharles.org.uk>> wrote:
>>>
>>>
>>>
>>>     On Tue, 12 Jul 2016, 1:23 a.m. David Feuer, <david.feuer at gmail.com
>>>     <mailto: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
>>>
>>>
>>>
>>> _______________________________________________
>>> Libraries mailing list
>>> Libraries at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>>
>>>
>>
>> --
>> Andreas Abel  <><      Du bist der geliebte Mensch.
>>
>> Department of Computer Science and Engineering
>> Chalmers and Gothenburg University, Sweden
>>
>> andreas.abel at gu.se
>> http://www2.tcs.ifi.lmu.de/~abel/
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160714/eba5ee3e/attachment.html>


More information about the Libraries mailing list