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
    成为关联的数据类型,因为我后来以某种方式使用了它。坦白地说,我问这个问题已经有一段时间了,所以我不记得细节了。谢谢你的机票链接。我之前看过,但并不真正理解问题所在。如果有人真的解释这张票,那就太好了:)