[Haskell-beginners] Ambiguous type variable

Francesco Ariis fa-ml at ariis.it
Thu Aug 17 13:29:27 UTC 2017


On Thu, Aug 17, 2017 at 12:24:07PM +0000, Jonathon Delgado wrote:
> 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?

That's correct! Indeed ghc is not complaining about a lack of
instances, as it would with, say

    λ> putStrLn 5
    -- • No instance for (Num String) arising from etc etc.

but about the *ambiguity* of type variable `e`.  How does `catch` know
_which_ exception to deal with if you don't specify the concrete type?
Consider:

    prova = catch (print $ div (error "hey bby") 0)
                  (\e -> print "ouch" >>
                         print (e :: ErrorCall))

    -- I want to deal with arithmetic errors here and not in `prova`
    palla = catch prova
                  (\e -> print "baaah" >>
                         print (e :: ArithException))

If I switch ArithException and ErrorCall the behaviour of invoking `palla`
changes.

Having a catch-all `catch` is possible by using (e :: SomeException);
if you don't care about `e` and just want to do an action regardless, you
are probably better off with `onException`.

Ask more if needed!


More information about the Beginners mailing list