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
?