63 votes

Données Constructeur promotion dans GHC-7.6

J'ai eu ce code:

class SymbolSet tpe where
  data Symbol tpe :: *

data SSet tpe where
  Identity :: tpe -> SSet tpe
  And :: SSet tpe -> Symbol tpe -> SSet tpe

class HasElem a b where

instance (SymbolSet tpe) => HasElem (And (Identity tpe) s) s
instance (HasElem sset s) => HasElem (And sset s) s

ce qui était en train de rassembler dans GHC-7.4. Cependant sur le déplacement à GHC-7.6-il commencé à donner des erreurs de compilation:

'And' of tpe `forall tpe. tpe -> Symbol * tpe -> SSet tpe' is not promotable

sur en fouillant dans les docs, j'ai trouvé un nouvel alinéa ajouté à "Type de données de la Promotion de" pages dans GHC-7.6 vs GHC-7.4

Nous ne favorisons pas les types de données dont les constructeurs sont de nature polymorphe, impliquer des contraintes, ou de l'utilisation quantification existentielle.

Ma question est:

  1. Quelle est la justification de ne pas la promotion de ces constructeurs?
  2. Quelle serait la bonne façon de faire?

1voto

jberryman Points 6615

Vous n'avez pas dit la version de GHC 7.6 vous utilisiez ou inclure les extensions que vous avez sur, donc je suppose un peu.

Ce billet semble répondre à votre question 1, bien que je ne suis pas totalement comprendre le problème moi-même. Dans votre exemple, je pense que SSet n'est pas promus parce que l'un de ses arguments (Symbol tpe) est associé à un type qui apporte avec elle l' SymbolSet contrainte.

Si je déplace Symbol de la classe que nous avons obtenu le type promu, mais maintenant nous obtenons sorte d'incompatibilité des erreurs:

{-# LANGUAGE DataKinds , TypeFamilies , GADTs , MultiParamTypeClasses #-}
class SymbolSet tpe where
  -- data Symbol tpe :: *
data Symbol tpe :: *
-- ...

Je peux obtenir tout le toutim pour compiler en ajoutant genre de signatures pour l' HasElem:

{-# LANGUAGE DataKinds , TypeFamilies , GADTs , MultiParamTypeClasses, FlexibleInstances  #-}
class SymbolSet tpe where
-- MOVED OUT OF CLASS:
data Symbol tpe :: *

data SSet tpe where
  Identity :: tpe -> SSet tpe
  And :: SSet tpe -> Symbol tpe -> SSet tpe

-- ADDED KIND SIGNATURES:
class HasElem (a :: SSet *) (b :: Symbol *) where

instance (SymbolSet tpe) => HasElem (And (Identity tpe) s) s
instance (HasElem sset s) => HasElem (And sset s) s

Je ne comprends pas vraiment votre code, de sorte que ne peuvent pas travailler pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X