{-# LANGUAGE DataKinds, ExistentialQuantification, KindSignatures #-}
import Data.Proxy
data Type t= forall (a :: t). Type (Proxy a)
给出错误
Type variable ‘t’ used in a kind
In the kind ‘t’
In the definition of data constructor ‘Type’
In the data declaration for ‘Type’
但是t
是一个Kind变量,而不是一个类型变量。发生了什么事?
答案 0 :(得分:9)
在GHC 8之前,任何地方都不允许任何类型的绑定。在这里,我们必须使用类型代理。在这种情况下,我们可以这样做:
import Data.Proxy
data Type (kp :: KProxy k) = forall (a :: k). Type (Proxy a)
使用GHC 8,您确实可以编写原始版本:
{-# language TypeInType #-}
data Type t = forall (a :: t). Type (Proxy a)
答案 1 :(得分:2)
类型构造函数的参数是类型,而不是种类。所以data Type t = ...
表示t
是一个类型变量。
在GHC 8.0中,TypeInType扩展名消除了类型和种类之间的区别,允许您启用程序时接受程序(如果不启用,GHC将建议启用扩展程序)。