Existe uma maneira de fazer o GHC fornecer as restrições de classe de tipo de furos tipados?

103

Comportamento atual

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 _

Comportamento desejado

Seria bom se o GHC também me dissesse que o buraco digitado tem a Showrestrição de classe de tipo.

Misc

GHC Versão 7.8.1

Wizek
fonte
16
AFAIK, isso não é possível no momento, mas certamente seria útil. Pode valer a pena abrir uma solicitação de recurso no rastreador de bug GHC para isso.
Kosmikus
11
Eu concordo que isso seria útil. Eu relatei isso como uma solicitação de recurso no GHC trac: ghc.haskell.org/trac/ghc/ticket/9479
Dominique Devriese
4
Por agora você pode usar pré-type-buracos truque: show (undefined :: () -> ()); GHC dirá mais no erro de verificação de tipo.
phadej
1
Esta é uma solicitação de recurso ou uma pergunta real? Ou seja, você tem certeza de que não há como fazer o GHC como deseja ou existe a possibilidade de obter o que deseja com o compilador atual, mas não sabe como?
stakx - não contribui mais em
1
@stakx É um pouco dos dois. Originalmente, quando escrevi esta pergunta, fiquei confuso por que o GHC não fornecia as restrições de classe de tipo e estava pensando que estava usando furos de digitação incorretos. Então alguns me disseram que atualmente isso não é possível fazer, mas poderia ser adicionado ao GHC. Então, eu esperava que fosse adicionado em breve. Muitos parecem querer usá-lo. O truque de phadej parece funcionar nesse meio tempo, mas não é tão elegante ou fácil de usar quanto uma solução baseada em orifícios digitados seria.
Wizek

Respostas:

2

Isso agora foi corrigido no GHC 8.0 graças ao tíquete GHC de @DominiqueDevriese .

Devido ao padrão de tipo estendido , isso não é imediatamente óbvio no GHCi. Com o seu exemplo,

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

o tipo de furo é o padrão (). Este é aparentemente o comportamento desejado , embora haja um argumento a ser feito de que o padrão estendido não deve se aplicar a lacunas (já que um uso comum para eles é fazer com que o compilador informe o tipo inferido).

No entanto, se você compilar com GHC ou desativar as regras padrão estendidas no GHCi (via :set -XNoExtendedDefaultRules), vemos o resultado das melhorias:

<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
fonte
1

Não, atualmente não é possível. Mas pode ser adicionado ao GHC de acordo com as especulações.

Vikas Anand
fonte
1

Experimentar it :: _ => _ no GHC 8.8+.

Michal Gajda
fonte