2016-03-05 99 views
2
{-# LANGUAGE DataKinds, ExistentialQuantification, KindSignatures #-} 
import Data.Proxy 

data Type t= forall (a :: t). Type (Proxy a) 

給出了錯誤爲什麼不存在量化和datakinds一起工作?

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是一類變量,而不是一個類型變量。這是怎麼回事?

+1

你還不能在具體語法混合類型和種類。你可以做的最好的就是數據類型(tp :: KProxy t)= forall(a :: t)。類型(代理a)'(儘管我沒看到這個數據類型會有多麼有用,但這完全是一個不同的問題。 – user2407038

回答

2

類型構造器的參數的數據類型,不種。所以data Type t = ...意味着t是一個類型變量。

在GHC 8.0 TypeInType擴展刪除類型和種類之間的區別,讓你啓用(和GHC會建議使分機,如果你不這樣做),你的程序被接受。

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) 
+0

我不確定這個確切的定義是否可以在GHC 8中工作,因爲Type是內置的那個版本 – bennofs

+0

我剛試過,它在ghci中有效,如果我們導入'Data.Kind',我們只會得到'Type'。 –

相關問題