Семейные приложения типа Haskell не оцениваются
Я обнаружил интересную ситуацию при использовании типов данных с семействами типов.
Сообщение об ошибке компилятора No instance for (C (ID ())) arising from a use of W
, Это предполагает, что приложение семейства типов не полностью оценено, даже когда оно насыщено. :kind! ID ()
оценивает ()
в соответствии с C ()
Экземпляр должен быть использован.
{-# LANGUAGE GADTs, TypeFamilies, UndecidableInstances, FlexibleContexts #-}
type family ID t where
ID t = t
class C t where
instance C () where
data W where
W :: C (AppID t) => P t -> W
type family AppID t where
AppID t = (ConstID t) ()
type family ConstID t where
ConstID t = ID
data P t where
P :: P t
data A
w :: W
w = W (P :: P A)
Могу ли я как-то форсировать оценку ID ()
? Это ошибка компилятора?
Я использую GHC 7.8.3
1 ответ
Решение
Проблема в том, ConstID
,
type family ConstID t a where
ConstID t a = ID a