3

型クラスがあるとします:

data Proxy a = Proxy
class Fixed a where 
  fixed :: Proxy a -> Int

の定義fixedは非常に簡単なので、次を使用して導出しGHC.Genericsます。

class GFixed f where 
  gfixed :: Proxy (f a) -> Int

instance (GFixed f, GFixed g) => GFixed (f :*: g) where ...

instance (GFixed f, GFixed g) => GFixed (f :+: g) where ...

instance GFixed f => GFixed (M1 i c f) where ...

instance Fixed a => GFixed (K1 i a) where ...

....

default fixed :: (Generic a, GFixed (Rep a)) => Proxy a -> Int
fixed _ = fixed (Proxy :: Proxy (Rep a b))

for void 型GFixed U1のインスタンスを持つ意味がないため、インスタンスの for は含めません。Fixed機械についての私の理解Genericsはあまりよくありません。具体的には、機械の種類M1K1意味についてです。質問は次のとおりです:の既定の定義が再帰型で機能しないGFixedように、型レベルで制限できますか?fixed

たとえば、次のように記述します。

data Void
instance Fixed Void

型エラーが発生します: No instance for (GFixed V1). などの型エラーを取得したいと思いinstance Fixed [Int]ます。

4

2 に答える 2

1

ドキュメンテーションは、コンストラクターの意味について適度に役立ちます 。M1メタ情報 (レコード セレクターの名前など) を指定K1し、 kind を使用してさまざまなものをつかみ*ます。すべての再帰を許可しない場合は、スコープ内のインスタンスが一致しないようにする必要がありますK1 R aKスコープ内の他のインスタンスのいくつかは引き続き必要になるため、変更する必要があります

instance Fixed a => GFixed (K1 i a) where

instance Fixed a => GFixed (K1 P a) where

の最初のパラメーターになる可能性のある他の値があるかどうかはわかりませんが、発生した場合は、もちろんK1例外を除いて、それらを追加しても安全です。K1 R

于 2014-04-17T00:09:46.683 に答える