У меня был этот код:
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
который компилируется в GHC-7.4. Однако при переходе на GHC-7.6 он начал давать ошибки компиляции:
'And' of tpe `forall tpe. tpe -> Symbol * tpe -> SSet tpe' is not promotable
при перекопах через документы я нашел новое предложение, добавленное в страницы "Datatype Promotion" в GHC-7.6 vs GHC-7.4
Мы не продвигаем типы данных, конструкторы которых являются добротными полиморфными, задействовать ограничения или использовать экзистенциальную квантификацию.
Мой вопрос:
- В чем причина не поощрения таких конструкторов?
- Каким будет правильный способ сделать это?