The code
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
-- I know this particular example is silly.
-- But that's not the point here.
g :: forall a . RealFloat a => Bool
g = True
main :: IO ()
main = print (g @Double)
fails to compile on GHC 8.0 with the error
• Could not deduce (RealFloat a0)
from the context: RealFloat a
bound by the type signature for:
g :: RealFloat a => Bool
at app/Main.hs:3:6-35
The type variable ‘a0’ is ambiguous
• In the ambiguity check for ‘g’
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the type signature:
g :: forall a. RealFloat a => Bool
So adding AllowAmbiguousTypes will make the code compile.
Here are my questions:
- What exactly is
AllowAmbiguousTypes? - Why is it needed to make this particular code work?
- I fear that adding
AllowAmbiguousTypesis giving me more than I really want in this particular code. It sounds scary. It sounds like it will make Haskell's type system less safe, perhaps in other areas that have nothing to do with this particular code. Are these fears unfounded? - Are there any alternatives? In this case, it seems like Haskell is inserting a
a0type variable that I never asked for. Is there no extension to tell Haskell not to create these extraneous type variables - and only use those that I explicitly told it to add with my own explicitforall a? - Added one question because of user2407038's comment: Would you say that
AllowAmbiguousTypesis a misnomer? Would it have been better named asAllowUnusedTypeVariables?