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:
- Quelle est la justification de ne pas la promotion de ces constructeurs?
- Quelle serait la bonne façon de faire?