2012-04-23 6 views
6

私は、ghc 7.4.1のDataKindsと型固有の操作を行うために使用したい与えられたtypeclassを使って宣伝するデータ型を持っています。昇格型の型クラスインスタンスを作成するにはどうすればよいですか?

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'のようなものを推測していますか?このようなものがどのように役立つか想像するのは難しいですが、もし私が本当に伸びていれば、何とか*役に立つと想像することができます。多分。 –

+0

アイデアは、それぞれのインスタンスの特性を持つことでした。だから私は値を探しているのではなく、単に型クラスを指定するためのプレースホルダと、結果的にそこで選択したい関数を探しています。 例:class TypeTraits(a :: Type)HType a sizeOf :: Proxy a - > Int' – Chetan

答えて

7

問題はクラスの本体にあります。持ち上げられた種類を持つ型には値がないため、パラメータとして受け取る関数を持つことはできません。 Proxy a -> Stringなどを使用する必要があります。

ところで、PolyKinds拡張機能を有効にすると、種類の注釈を完全に省略することができます。 (実際には、あなた自身がProxy型を定義するためにこれを行う必要があるかもしれません。なぜなら、Data33Proxyからのものは* -> *ですが、Type -> *が必要です。data Proxy p = ProxyPolyKindsで定義すると、 AnyK -> *

+1

[論文](http://research.microsoft.com/en-us/)のProxyデータ型。 people/dimitris/fc-kind-poly.pdf)が最終的に意味があります、ありがとう! – Chetan

関連する問題