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

Carter Schonwald carter.schonwald at gmail.com
Thu Jul 14 22:20:08 UTC 2016


At this point maybe it'd be better to write out these ideas as a library
and implement a bunch of example codes for different approaches.  Changing
the interfaces for exception handling code is subtle stuff!

On Jul 14, 2016 5:42 PM, "Oliver Charles" <ollie at ocharles.org.uk> wrote:

> 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/
>>>
>>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160714/d4d0d676/attachment-0001.html>


More information about the Libraries mailing list