반응형
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"페이지에 추가 된 새로운 조항을 발견했습니다.
생성자가 종류 다형성이거나 제약 조건을 포함하거나 실존 적 정량화를 사용하는 데이터 유형을 홍보하지 않습니다.
내 질문은 :
- 그러한 생성자를 홍보하지 않는 이유는 무엇입니까?
- 올바른 방법은 무엇입니까?
사용중인 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
반응형
'Program Tip' 카테고리의 다른 글
대소 문자를 구분하지 않는 배열 검색 (0) | 2020.11.26 |
---|---|
PHP에 Java HashMap에 해당하는 것이 있습니까? (0) | 2020.11.26 |
Google지도는 경로에서 드래그시 경로를 강조 (0) | 2020.11.25 |
Scala 미들웨어 선택의 차이점은 무엇입니까? (0) | 2020.11.25 |
Parse Javascript API를 Appcelerator와 어떻게 통합하고 문서화되지 않은 호출을 사용하지 않습니까? (0) | 2020.11.25 |