On Thu, Aug 17, 2017 at 10:55 AM, Jonathon Delgado <voldermort@hotmail.com> wrote:
I'm trying to use
  catch (...) (\e -> putStrLn $ show e)
However, I get an error
  Ambiguous type variable ‘a0’ arising from a use of ‘show’ prevents the constraint ‘(Show a0)’ from being solved.
This goes away if I change the code to
  catch (...) (\e -> putStrLn $ show (e::IOException))

A couple of things I don't understand here:
- The signature for catch begins "Exception e", and exception it "class (Typeable e, Show e) => Exception e". So why isn't show automatically available?
- Why does the new code work at all? e is Exception, not IOException. What would happen if it caught a different Exception?


In my experience, the most common thing people need is "catch all synchronous exceptions." The word "synchronous" there is the source of a lot of confusion, and relates to a complicated topic of asynchronous exceptions. My recommendation is: don't worry about that right now, use the safe-exceptions package, and switch from catch to catchAny. More details on the package are available at:

https://haskell-lang.org/library/safe-exceptions