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

Theodore Lief Gannon tanuki at gmail.com
Wed Jul 13 21:23:04 UTC 2016


+1 on catchMaybe from this corner of the peanut gallery, FWIW. It feels far
more idiomatic, and provides the same power with fewer moving parts.
On Jul 13, 2016 1:14 PM, "David Feuer" <david.feuer at gmail.com> wrote:

> I hate having to make arbitrary choices when writing code. With
> `catchJust`, I have to decide what to calculate in the selector and
> what to calculate in the handler. As far as I can tell, there's never
> any reason to leave any calculation for the handler.
>
> I don't think the `Maybe (IO a)` type is nearly as hard to think about
> as exceptions themselves are. The handler either provides a recovery
> action or it doesn't. The catchMaybe signature strikes me, personally,
> as easier to understand, because I don't need to use parametricity to
> string the pieces together.
>
> On Wed, Jul 13, 2016 at 3:36 PM, Andreas Abel <andreas.abel at ifi.lmu.de>
> wrote:
> > I can only guess why catchJust was designed like it is.  A type like
> >
> >   b -> Maybe (IO a)
> >
> > is not as intuitive as the types
> >
> >   e -> Maybe b
> >     -- ^ if you do not understand this, get back to Haskell school!
> >
> >   b -> IO a
> >     -- ^ a continuation, we know this from >>= and friends
> >
> > A type like  Maybe (IO a)  is more unusual, requires more thinking.
> >
> > +-0. I have no opinion on what is better.
> >
> >
> > On 12.07.2016 02:23, David Feuer 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".
> >>
> >>
> >>
> >> _______________________________________________
> >> 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/20160713/a8015740/attachment.html>


More information about the Libraries mailing list