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

Andreas Abel andreas.abel at ifi.lmu.de
Wed Jul 13 19:36:28 UTC 2016


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/


More information about the Libraries mailing list