11

DataKinds では、次のような定義

data KFoo = TFoo

KFoo :: BOX種類と種類を紹介しTFoo :: KFooます。なぜ私は定義に進むことができないのですか

data TFoo = CFoo

そのようなCFoo :: TFoo、、?TFoo :: KFooKFoo :: BOX

すべてのコンストラクターは、 kind に属する型に属する必要があり*ますか? もしそうなら、なぜですか?

編集: コンストラクターと型は名前空間を共有するため、これを行ってもエラーは発生しませんが、昇格したコンストラクターではなく通常の型として名前を明確にするため、GHC は競合を許可します。ドキュメント'には、昇格したコンストラクターを参照するために a をプレフィックスとして付けるように記載されています。その2行目を次のように変更すると

data 'TFoo = CFoo

エラーが発生します

不正な型またはクラス宣言の先頭: TFoo

4

2 に答える 2

9

すべてのコンストラクターは、 kind に属する型に属する必要があり*ますか?

はい。まさにそれが*意味することです: それは一種の (持ち上げられた/箱入りで、その部分についてはよくわかりません) Haskell 型です。type実際、他のすべての種類は、構文を共有していますが、実際には型の種類ではありません。むしろ*型のメタタイプ レベルの型であり、他のすべての種類は、型ではなく型コンストラクターまたはまったく異なるもののメタタイプ レベルの型です。

(繰り返しますが、ボックス化されていない型の種類についても何かがあります。それらは確かに型ですが、これはコンストラクターでは不可能だと思いますdata。)

于 2014-06-26T20:46:15.607 に答える
6

すべてのコンストラクターは、種類 * に属する型に属する必要がありますか? もしそうなら、なぜですか?

*それらがタイプ(または)でなければならない最も重要な理由#は、GHC で採用されている相分離です:DataKindsコンパイル中に消去されます。シングルトン GADT データ型を定義することにより、実行時にのみ間接的に表現できます。

{-# LANGUAGE DataKinds #-}

data Nat = Z | S Nat

data SNat n where
   SZ :: SNat Z
   SS :: SNat n -> SNat (S n)

しかし、DataKindインデックス自体はまだ実行時に存在しません。さまざまな種類は、フェーズ分離の単純なルールを提供しますが、これは依存型ではそれほど単純ではありません (型レベルのプログラミングを大幅に簡素化する可能性はありますが)。

于 2014-06-26T21:20:21.120 に答える