Haskell GHC-7.6中的数据构造函数提升
我有这个密码:Haskell GHC-7.6中的数据构造函数提升,haskell,constructor,ghc,Haskell,Constructor,Ghc,我有这个密码: 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
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
在翻阅文档时,我发现在vs中的“数据类型提升”页面中添加了一个新的子句
我们不推广构造函数是多态的数据类型,
包含约束,或使用存在量化
我的问题是:
你没有说你使用的是哪个版本的GHC7.6,也没有说你有哪些扩展,所以我只是猜测一下 似乎回答了你的问题1,虽然我自己并不完全理解这个问题。在您的特定示例中,我认为
SSet
不可升级,因为它的一个参数(Symbol tpe
)是一个关联类型,它附带了SymbolSet
约束
如果我将Symbol
移出类,则会升级类型,但现在会出现种类不匹配错误:
{-# LANGUAGE DataKinds , TypeFamilies , GADTs , MultiParamTypeClasses #-}
class SymbolSet tpe where
-- data Symbol tpe :: *
data Symbol tpe :: *
-- ...
我可以通过向HasElem添加善意的签名来编译整个shebang:
{-# 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
对于第二个问题,我认为问题在于
SSet(And)
构造函数的字段中有数据族(即Symbol
)。至少,即使我通过额外的种类注释将种类明确限制为*
,问题仍然存在。因此,编译错误的原因可能不是多种类的。正如我所说,我在GHC-7.4中使用了完全相同的代码。几乎一样,因为我编辑它是为了让它在这里更有意义。我目前无法访问安装了7.4的计算机,但我会尽快尝试验证。我认为您应该报告一个错误,错误消息没有给出构造函数不可升级的原因。我也对答案感兴趣。有点离题了,我还想知道HasElem打算如何使用!这可能有助于制定一个不同的解决方案。我对HasElem有一些问题,我有类似的问题。。。我一直在等待…我实际上希望Symbol tpe
成为关联的数据类型,因为我后来以某种方式使用了它。坦白地说,我问这个问题已经有一段时间了,所以我不记得细节了。谢谢你的机票链接。我之前看过,但并不真正理解问题所在。如果有人真的解释这张票,那就太好了:)