Я нашел интересную ситуацию при использовании типов данных с типами семейств.Семейные приложения типа 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
Как (ID()) оценивает что-либо? Для семейства ID нет экземпляров. – augustss
Я написал его как закрытое семейство типов (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –
Написание его как семейства нормального типа не изменяет ошибку. –