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


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)

1

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.