haskell - son - que hay dentro de un agujero negro
¿Hay alguna manera de hacer que GHC proporcione las restricciones de clase de tipo de agujeros tipados? (2)
Comportamiento actual
Prelude> show _
<interactive>:7:6:
Found hole ‘_’ with type: a0
Where: ‘a0’ is an ambiguous type variable
Relevant bindings include it :: String (bound at <interactive>:7:1)
In the first argument of ‘show’, namely ‘_’
In the expression: show _
In an equation for ‘it’: it = show _
Comportamiento deseado
Sería bueno si GHC también me dijera que el agujero mecanografiado tiene la restricción Show
clase de tipo.
Misc
Versión GHC 7.8.1
Esto ahora está arreglado en GHC 8.0 gracias al ghc.haskell.org/trac/ghc/ticket/9479 @ DominiqueDevriese.
Debido al incumplimiento de tipo extendido , esto no es inmediatamente obvio en GHCi. Con tu ejemplo,
> show _
<interactive>:7:6: error:
• Found hole: _h :: ()
Or perhaps ‘_h’ is mis-spelled, or not in scope
• In the first argument of ‘show’, namely ‘_h’
In the expression: show _h
In an equation for ‘it’: it = show _h
• Relevant bindings include
it :: String (bound at <interactive>:7:1)
el tipo de agujero está predeterminado en ()
. Este es aparentemente el comportamiento deseado , aunque hay un argumento que se debe hacer para que el incumplimiento extendido no se aplique a los agujeros (ya que un uso común para ellos es hacer que el compilador le diga el tipo inferido).
Sin embargo, si compila con GHC o deshabilita las reglas predeterminadas extendidas en GHCi (a través de :set -XNoExtendedDefaultRules
), vemos el resultado de las mejoras:
<interactive>:3:1: error:
• Ambiguous type variable ‘a0’ arising from a use of ‘show’
prevents the constraint ‘(Show a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show Integer -- Defined in ‘GHC.Show’
instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
...plus 22 others
...plus 11 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the expression: show _
In an equation for ‘it’: it = show _
<interactive>:3:6: error:
• Found hole: _ :: a0
Where: ‘a0’ is an ambiguous type variable
• In the first argument of ‘show’, namely ‘_’
In the expression: show _
In an equation for ‘it’: it = show _
• Relevant bindings include
it :: String (bound at <interactive>:3:1)
No, actualmente no es posible. Pero se puede agregar a GHC según las especulaciones.