Existe-t-il un moyen de faire en sorte que GHC fournisse les contraintes de classe de type des trous typés?


103

Comportement actuel

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 _

Comportement désiré

Ce serait bien si GHC me disait également que le trou typé a la Showcontrainte de classe de type.

Divers

GHC version 7.8.1


16
AFAIK, ce n'est actuellement pas possible, mais ce serait certainement utile. Cela pourrait valoir la peine d'ouvrir une demande de fonctionnalité sur le suivi des bogues du GHC.
kosmikus

11
Je conviens que ce serait utile. Je l'ai signalé comme une demande de fonctionnalité sur le trac GHC: ghc.haskell.org/trac/ghc/ticket/9479
Dominique Devriese

4
Pour l' instant , vous pouvez utiliser des trous-prédiabète de type trick: show (undefined :: () -> ()); GHC en dira plus dans l'erreur de vérification de type.
phadej

1
Est-ce une demande de fonctionnalité ou une vraie question? Autrement dit, savez-vous avec certitude qu'il n'y a aucun moyen de faire GHC comme vous le souhaitez, ou y a-t-il la possibilité que vous puissiez obtenir ce que vous voulez avec le compilateur actuel, mais vous ne savez pas comment?
stakx - ne contribue plus le

1
@stakx C'est un peu des deux. À l'origine, lorsque j'ai écrit cette question, je ne savais pas pourquoi GHC ne fournissait pas les contraintes de classe de type et je pensais que j'utilisais mal les trous typés. Ensuite, certains m'ont dit que ce n'est actuellement pas possible de le faire, mais pourrait être ajouté à GHC. Alors j'espérais qu'il serait bientôt ajouté. Beaucoup semblent vouloir l'utiliser. L'astuce de phadej semble fonctionner en attendant, mais n'est pas aussi élégante ou facile à utiliser qu'une solution basée sur un trou typé le serait.
Wizek

Réponses:


2

Ce problème est désormais résolu dans GHC 8.0 grâce au ticket GHC de @ DominiqueDevriese .

En raison de la configuration par défaut du type étendu , ce n'est pas immédiatement évident dans GHCi. Avec votre exemple,

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

le type de trou est défini par défaut (). C'est apparemment le comportement souhaité , bien qu'il y ait un argument à faire pour dire que la valeur par défaut étendue ne devrait pas s'appliquer aux trous (car une utilisation courante pour eux est de demander au compilateur de vous indiquer le type inféré).

Néanmoins, si vous compilez avec GHC ou désactivez les règles par défaut étendues dans GHCi (via :set -XNoExtendedDefaultRules), nous voyons le résultat des améliorations:

<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

Non actuellement, ce n'est pas possible, mais il peut être ajouté à GHC selon les spéculations.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.