[Haskell-beginners] Ambiguous type variable

Jonathon Delgado voldermort at hotmail.com
Thu Aug 17 12:24:07 UTC 2017


I'm sure it makes sense! I'm not really following though.

I understood typeclasses to be analogous to OO interfaces. So if a variable implements the Exception interface, and Exception implements the Show interface, then it should automatically support show.

I take it this was wrong? How does the compiler use typeclasses if they're not interfaces?


Francesco Ariis  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? 

IOException is a concrete type while Exception is a typeclass. In the end, 
the compiler needs the former, the latter not being enough. 

The code works as any other class-based function would 

    someFunction :: Monoid a -> [a] -> a 
    -- ^-- in the end `Monoid a` will become something concrete, like 
    -- a String, a Sum, etc. 

Does that make sense? 


More information about the Beginners mailing list