不评估Haskell类型族应用程序

时间:2014-09-16 16:32:57

标签: haskell gadt type-families data-kinds

当使用类型系列的数据种类时,我发现了一个有趣的情况。

编译器的错误消息为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 个答案:

答案 0 :(得分:2)

问题在于ConstID

type family ConstID t a where
  ConstID t a = ID a