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

David Feuer david.feuer at gmail.com
Wed Jul 13 20:14:46 UTC 2016


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/


More information about the Libraries mailing list