2011-11-13 42 views
6

Associated Type Synonyms(Chakravarty,凱勒·瓊斯)的文件似乎表明,以下是有效的:是否有可能有與類型類中未提及的變量關聯的類型同義詞?

class C a where 
    type S a (k :: * -> *) :: * 

然而,當我嘗試和運行此我得到一個編譯錯誤(與-XTypeFamilies):

Not in scope: type variable `k' 

我錯過了什麼,或者是GHC中的實際實現與文章中提到的不一樣嗎?

+0

我現在發現http://hackage.haskell.org/trac/ghc/ticket/3714對我來說,這看起來好像不能這樣做。如果這是正確的,請隨時回答。 – ocharles

回答

4

正如你已經發現,this is not possible in GHC

完全按照相關的數據申報的情況下,命名的類型參數必須是類參數的一個子集的排列。例如

class C a b c where { type T c a :: * } -- OK 
class D a where { type T a x :: * }  -- No: x is not a class parameter 
class D a where { type T a :: * -> * } -- OK 

你提到的票實際上解釋了不能夠定義諸如S東西的原因。它可以工作,如果你這樣做:

class C a where 
    type S a :: (* -> *) -> * 
data TupK a k = TupK (a, k a) 
instance C [a] where 
    type S [a] = TupK a 

但是,現在你堅持一種新的數據類型。使用類型同義詞將不起作用(「類型同義詞`TupK'應該有兩個參數」),並且向S添加更多參數將無濟於事(「參數個數必須匹配族聲明;預期1」),如票。

+0

無賴,但感謝您的詳細回覆! – ocharles

+1

@ocharles我會補充說,你不*有*使用*關聯*類型。你可以很好地做類似家庭S a(k :: * - > *); class C a其中foo :: S a [] - > Int'。關聯類型的主要優點是它使編譯器更容易提供良好的錯誤消息(以及用於聲明類型實例的更方便的語法)。 –

+0

是的,現在我已經分開了2,但很高興讓他們配對 – ocharles

1

沒有,但你可以做的那麼強大:

class C a where 
    type S a :: (k :: * -> *) -> * 

......這能起到相同的作用,如果你不需要額外的電源。

相關問題