Вы не сказали, какую версию GHC 7.6 Вы использовали или включаете, на каких расширениях Вы имеете, таким образом, я предполагаю немного.
Этот билет , кажется, отвечает на Ваш вопрос 1, хотя я не полностью понимаю проблемы сам. В Вашем конкретном примере я думаю SSet
, не promotable, потому что одним из его аргументов (Symbol tpe
) является связанный тип, который приносит с ним SymbolSet
ограничение.
, Если я перемещаюсь Symbol
из класса, мы продвинули тип, однако теперь мы получаем добрые ошибки несоответствия:
{-# LANGUAGE DataKinds , TypeFamilies , GADTs , MultiParamTypeClasses #-}
class SymbolSet tpe where
-- data Symbol tpe :: *
data Symbol tpe :: *
-- ...
я могу заставить целую хижину компилировать путем добавления добрых подписей к 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
я действительно не понимаю Ваш код так, чтобы мог не работать на Вас.