Program Tip

GHC-7.6의 데이터 생성자 승격

programtip 2020. 11. 25. 08:24
반응형

GHC-7.6의 데이터 생성자 승격


이 코드가 있습니다.

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 vs GHC-7.4의 "Datatype Promotion"페이지에 추가 된 새로운 조항을 발견했습니다.

생성자가 종류 다형성이거나 제약 조건을 포함하거나 실존 적 정량화를 사용하는 데이터 유형을 홍보하지 않습니다.

내 질문은 :

  1. 그러한 생성자를 홍보하지 않는 이유는 무엇입니까?
  2. 올바른 방법은 무엇입니까?

사용중인 GHC 7.6 버전을 말하지 않았거나 사용중인 확장 기능을 포함하지 않았으므로 조금 추측하고 있습니다.

이 티켓 은 귀하의 질문 1에 대한 답변 인 것 같습니다만, 제가 직접 문제를 완전히 이해하지는 못합니다. 귀하의 특정 예에서 SSet인수 ( Symbol tpe) 중 하나가 SymbolSet제약 조건 을 가져 오는 관련 유형 이기 때문에 홍보 할 수 없다고 생각 합니다.

내가 이동하는 경우 Symbol클래스 밖으로 우리는 그러나 지금 우리는 어떤 불일치 오류를 얻을, 승진 종류 :

{-# LANGUAGE DataKinds , TypeFamilies , GADTs , MultiParamTypeClasses #-}
class SymbolSet tpe where
  -- data Symbol tpe :: *
data Symbol tpe :: *
-- ...

다음과 같은 종류의 서명을 추가하여 전체 shebang을 컴파일 할 수 있습니다 HasElem.

{-# 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

나는 당신의 코드를 정말로 이해하지 못해서 당신에게 효과가 없을 수도 있습니다.

참고 URL : https://stackoverflow.com/questions/19875636/data-constructor-promotion-in-ghc-7-6

반응형