これらの2つのGADT宣言には違いがありますか?GADTヘッドのタイプ変数は意味がありますか?
data A a b where
...
data A :: * -> * -> * where
...
これらの2つのGADT宣言には違いがありますか?GADTヘッドのタイプ変数は意味がありますか?
data A a b where
...
data A :: * -> * -> * where
...
違いはありません。一つは、ヘッダーに型変数に言及せずのように、コンストラクタのシグネチャに彼らのために別の名前を使用するために必要なことだと思うかもしれません:the GHC Users Guideが言うように...、しかし
data A :: * -> * -> * where
AN :: Num x => x -> b -> A x b
AS :: IsString s => s -> b -> A s b
Haskell-98スタイルのデータ型宣言とは異なり、
data Set a where
ヘッダーの型変数にはスコープがありません。
...ので、これも動作します:
data A a b where
AN :: Num x => x -> b -> A x b
AS :: IsString s => s -> b -> A s b
優秀な質問を。これは私のペットピースです - 私はいつも名前が別の場所では無関係なように見えるときにインデックスの名前を付ける必要があるのか疑問に思っていました。これは、例えば、Agda/Coqのような従属システムで使用される誘導型の指標対パラメータとは非常に異なります。 – chi
逆に、タイプファミリーでは、タイプファミリーA :: * - > * - > * 'とタイプファミリーA a :: * - > *'の違いがあることに注意してください。 'A Int Bool = Char;のようなインスタンス。 A Int Char = Bool 'であり、後者はそうではない。 'A Int = Maybe'。 (型名Aは:: * - > * ')でも – chi
...の中では、' 'a''の名前はまだ無関係ですが、' '型B b :: *'はあなたには使えません。 'MaybeTBa'です。これは' family B :: * - > * 'で可能です。前者は[部分型同義語アプリケーション](http://stackoverflow.com/a/4923883/745903)です。 ( 'LiberalTypeSynonyms'は時にはこの制限を回避することができます) – leftaroundabout