私はこのコードを持っていました:
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
ドキュメントを掘り下げると、 GHC-7.6とGHC-7.4の「データ型プロモーション」ページに追加された新しい節が見つかりました。
コンストラクターが種多態的である、制約を伴う、または存在量化を使用するデータ型は昇格しません。
私の質問は:
- そのようなコンストラクターを宣伝しない理由は何ですか?
- それを行う正しい方法は何ですか?