[Haskell-beginners] Ambiguous type variable

Michael Snoyman michael at snoyman.com
Thu Aug 17 08:58:31 UTC 2017


On Thu, Aug 17, 2017 at 10:55 AM, Jonathon Delgado <voldermort at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20170817/d817bd7a/attachment.html>


More information about the Beginners mailing list