2016-11-24 6 views
8

これらの2つのGADT宣言には違いがありますか?GADTヘッドのタイプ変数は意味がありますか?

data A a b where 
    ... 

data A :: * -> * -> * where 
    ... 
+4

優秀な質問を。これは私のペットピースです - 私はいつも名前が別の場所では無関係なように見えるときにインデックスの名前を付ける必要があるのか​​疑問に思っていました。これは、例えば、Agda/Coqのような従属システムで使用される誘導型の指標対パラメータとは非常に異なります。 – chi

+2

逆に、タイプファミリーでは、タイプファミリーA :: * - > * - > * 'とタイプファミリーA a :: * - > *'の違いがあることに注意してください。 'A Int Bool = Char;のようなインスタンス。 A Int Char = Bool 'であり、後者はそうではない。 'A Int = Maybe'。 (型名Aは:: * - > * ')でも – chi

+1

...の中では、' 'a''の名前はまだ無関係ですが、' '型B b :: *'はあなたには使えません。 'MaybeTBa'です。これは' family B :: * - > * 'で可能です。前者は[部分型同義語アプリケーション](http://stackoverflow.com/a/4923883/745903)です。 ( 'LiberalTypeSynonyms'は時にはこの制限を回避することができます) – leftaroundabout

答えて

8

違いはありません。一つは、ヘッダーに型変数に言及せずのように、コンストラクタのシグネチャに彼らのために別の名前を使用するために必要なことだと思うかもしれません: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 
+2

確かに、私は最初のものが一番好きですが、それは短くて、私は怠惰なので、常に二番目に書くことになります。私はそれを想起させる名前を与えるために文書化に役立つかもしれません。 – chi

+1

私は優しい署名を書くのが好きではないので、私は第2のスタイルを好む。 –

+0

私は、構文から型変数を省略することが可能だったと思いますが、部分的な種類のシグネチャが必要になります。 – dfeuer

関連する問題