为什么不存在量化和数据合作?

时间:2016-03-05 16:38:51

标签: haskell ghc dependent-type existential-type data-kinds

{-# 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变量,而不是一个类型变量。发生了什么事?

2 个答案:

答案 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将建议启用扩展程序)。