¿Qué es AllowAmbiguousTypes y por qué se necesita en este ejemplo "para todos"?

El 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)

no se compila en GHC 8.0 con el 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

Entonces agregandoAllowAmbiguousTypes hará que el código se compile.

Aquí están mis preguntas:

Que es exactamenteAllowAmbiguousTypes?¿Por qué es necesario hacer que este código en particular funcione?Me temo que agregarAllowAmbiguousTypes me está dando más de lo que realmente quiero en este código en particular. Suena aterrador Parece que hará que el sistema de tipos de Haskell sea menos seguro, tal vez en otras áreas que no tienen nada que ver con este código en particular. ¿Son infundados estos temores?¿Hay alguna alternativa? En este caso, parece que Haskell está insertando una0 variable de tipo que nunca solicité. ¿No hay una extensión para decirle a Haskell que no cree estas variables de tipo extraño, y solo use aquellas que le dije explícitamente que agregue con mi propiaforall a?Se agregó una pregunta debido ausuario2407038Comentario de: ¿Dirías queAllowAmbiguousTypes es un nombre inapropiado? Hubiera sido mejor nombrado comoAllowUnusedTypeVariables?

Respuestas a la pregunta(1)

Su respuesta a la pregunta