2012-04-23 107 views
6

我有一個數據類型,我通過ghc 7.4.1中的DataKinds和一個給定的類型類型,我想用來做類型特定的操作。如何創建升級類型的類型類實例?

data Type = TInt32 | TInt64 | TInt16 
class TypeTraits a where 
    ... 

然後我嘗試創建提升類型的類型類實例,像這樣:

instance TypeTraits TInt32 where 
    ... 

我得到以下類型的錯誤:

Kind mis-match 
The first argument of `TypeTraits' should have kind `*', 
but `TInt32' has kind `Type' 
In the instance declaration for `TypeTraits TInt32' 

試圖通過指定要解決這個問題'a'的種類:

class TypeTraits (a :: Type) where 
    ... 

Kind mis-match 
Expected kind `ArgKind', but `a' has kind `Type' 
In the type `a -> String' 
In the class declaration for `TypeTraits' 
+0

你究竟能把什麼放到'''區域? 'TInt32'不是一個有人居住的類型,所以它不能在價值位置使用'a'。我猜像'crazyThing :: TypeTraits a => SomeTypeConstructor a'?我很難想象這樣的事情可能是有用的,但如果我真的伸展,我可以想象它有用*不知何故*。也許。 – 2012-04-24 04:33:21

+0

這個想法是有每個實例的特徵。所以我沒有在尋找值,而只是一個佔位符來指定類型類型,因此我想在那裏選擇函數。 例如:class TypeTraits(a :: Type)其中type HType a sizeOf :: Proxy a - > Int' – Chetan 2012-04-24 15:51:48

回答

7

問題出在班級的身上;具有提升類型的類型沒有任何值,因此不能有將參數作爲參數的函數。你將不得不使用Proxy a -> String或類似的。

順便說一句,如果你打開PolyKinds擴展,那麼你應該能夠完全省略這種註釋。 (其實,你可能必須這樣做,來定義你自己的Proxy類型,因爲我認爲Data.Proxy中的一個可能是* -> *,而你需要Type -> *。如果你定義了data Proxy p = Proxy並且PolyKinds開啓,那麼它會被推斷爲AnyK -> *。)

+1

[paper]中的Proxy數據類型(http://research.microsoft.com/en-us/ people/dimitris/fc-kind-poly.pdf)終於有道理,謝謝! – Chetan 2012-04-23 20:28:10

相關問題