当使用类型系列的数据种类时,我发现了一个有趣的情况。
编译器的错误消息为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
答案 0 :(得分:2)
问题在于ConstID
。
type family ConstID t a where
ConstID t a = ID a