¿Hay alguna forma de hacer que GHC proporcione las restricciones de clase de tipo de los agujeros mecanografiados?

103

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 escrito tiene la Showrestricción de clase de tipo.

Misc

GHC versión 7.8.1

Wizek
fuente
16
AFAIK, esto no es posible actualmente, pero sin duda sería útil. Podría valer la pena abrir una solicitud de función en el rastreador de errores de GHC para esto.
kosmikus
11
Estoy de acuerdo en que esto sería útil. Lo informé como una solicitud de función en GHC trac: ghc.haskell.org/trac/ghc/ticket/9479
Dominique Devriese
4
Por ahora se puede utilizar pre-tipo-agujeros truco: show (undefined :: () -> ()); GHC le dirá más en el error de verificación de tipo.
phadej
1
¿Es esta una solicitud de función o una pregunta real? Es decir, ¿sabe con certeza que no hay forma de crear GHC como desea, o existe la posibilidad de que pueda obtener lo que desea con el compilador actual, pero no está seguro de cómo?
stakx - ya no contribuye
1
@stakx Es un poco de ambos. Originalmente, cuando escribí esta pregunta, estaba confundido por qué GHC no proporcionaba las restricciones de clase de tipo y pensaba que estaba usando los agujeros mecanografiados incorrectamente. Luego, algunos me dijeron que actualmente esto no es posible, pero podría agregarse a GHC. Entonces esperaba que se agregara pronto. Muchos parecen querer usarlo. El truco de phadej parece funcionar mientras tanto, pero no es tan elegante o fácil de usar como lo sería una solución basada en agujeros mecanografiados.
Wizek

Respuestas:

2

Esto ahora está arreglado en GHC 8.0 gracias al ticket GHC de @ DominiqueDevriese .

Debido al tipo extendido predeterminado , esto no es obvio de inmediato 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 (). Este es aparentemente el comportamiento deseado , aunque se puede argumentar que el incumplimiento extendido no debería aplicarse 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 (vía :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)
crockeea
fuente
1

No, actualmente no es posible, pero se puede agregar a GHC según las especulaciones.

Vikas Anand
fuente
1

Prueba it :: _ => _en GHC 8.8+.

Michal Gajda
fuente