我有这个代码:
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的“数据类型提升”页面中添加了一个新条款
我们不推广其构造函数是多态的、涉及约束或使用存在量化的数据类型。
我的问题是:
- 不推广此类建设者的理由是什么?
- 正确的做法是什么?