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'
4

1 に答える 1

7

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

ちなみに、PolyKinds拡張機能をオンにすると、kind アノテーションを完全に省略できるはずです。(実際には、独自のProxy型を定義するために、これを行う必要があるかもしれません。Data.Proxyの型は* -> *である可能性があるため、 が必要Type -> *です。 on で定義するdata Proxy p = ProxyPolyKinds、 として推論されAnyK -> *ます。)

于 2012-04-23T19:12:06.937 に答える