63
задан 15 February 2014 в 08:14

1 ответ

Вы не сказали, какую версию 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

я действительно не понимаю Ваш код так, чтобы мог не работать на Вас.

1
ответ дан 31 October 2019 в 13:01

Другие вопросы по тегам:

Похожие вопросы: