¿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
?