O que é AllowAmbiguousTypes e por que é necessário neste exemplo "forall"?

O código

{-# 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)

falha ao compilar no GHC 8.0 com o erro

• 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

Então adicionandoAllowAmbiguousTypes fará o código compilar.

Aqui estão as minhas perguntas:

O que exatamente éAllowAmbiguousTypes?Por que é necessário fazer esse código específico funcionar?Eu temo que adicionarAllowAmbiguousTypes está me dando mais do que realmente quero neste código em particular. Parece assustador. Parece que isso tornará o sistema de tipos de Haskell menos seguro, talvez em outras áreas que não têm nada a ver com esse código específico. Esses medos são infundados?Existem alternativas? Nesse caso, parece que Haskell está inserindo uma0 tipo variável que eu nunca pedi. Não há extensão para dizer a Haskell para não criar essas variáveis de tipo estranhas - e use apenas aquelas que eu expliquei explicitamente para adicionar com minhas próprias explícitasforall a?Adicionada uma pergunta por causa deuser2407038Comentário de: Você diria issoAllowAmbiguousTypes é um nome impróprio? Teria sido melhor nomeado comoAllowUnusedTypeVariables?

questionAnswers(1)

yourAnswerToTheQuestion