HaskellのDataKinds拡張とは?
質問
私はDataKindsエクステンションの説明を探しています。 あなたにハスケルを学ぶ . 私が学んだことを少しでも理解できるような標準的なソースはありますか?
編集:たとえば ドキュメント にはこうあります。
XDataKindsを使うと、GHCは自動的にすべての適切なデータ型をkindに昇格させます。 を種類に、そしてその(値の)コンストラクタを型コンストラクタに自動的に昇格させます。 以下の型は
と例示しています。
data Nat = Ze | Su Nat
は、以下のような種類と型構成子を生じます。
Nat :: BOX
Ze :: Nat
Su :: Nat -> Nat
要領を得ない。何が言いたいのかわからないが
BOX
の意味は理解できないが、ステートメント
Ze :: Nat
と
Su :: Nat -> Nat
は、Ze と Su が ghci で期待されるような通常のデータコンストラクタであるという、すでに通常であることを述べているように見えます。
Prelude> :t Su
Su :: Nat -> Nat
どのように解決するのですか?
まずは基本的なところから
種類
種類とは、種類*の種類であり、例えば
Int :: *
Bool :: *
Maybe :: * -> *
注目すべきは
->
は種類レベルでも "function" を意味するようにオーバーロードされていることに注意してください。つまり
*
は通常のHaskellの型の種類です。
で何かの種類を表示するようにGHCiに依頼することができます。
:k
.
データの種類
独自の種類を作る方法がないので、これはあまり役に立ちません! とはいえ
DataKinds
と書くと
data Nat = S Nat | Z
GHCはこれを昇格させて、対応する種類の
Nat
とします。
Prelude> :k S
S :: Nat -> Nat
Prelude> :k Z
Z :: Nat
そこで
DataKind
を使うことで、親切なシステムが拡張可能になります。
用途
GADTを使った典型的な種類の例を見てみましょう。
data Vec :: Nat -> * where
Nil :: Vec Z
Cons :: Int -> Vec n -> Vec (S n)
ここで、私たちの
Vec
型は長さによってインデックス化されていることがわかります。
これが基本的な、10kフィートの概要です。
これは実際に続いています。
Values : Types : Kinds : Sorts ...
いくつかの言語(Coq、Agda ...)はこの宇宙の無限スタックをサポートしていますが、Haskellはすべてを1つのソートにひとまとめにしています。
関連
-
[解決済み] Haskellバイナリツリー
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み] GHCはなぜこんなに大きいのか/大きいのか?
-
[解決済み】Haskell/GHCの`forall`キーワードは何をするのですか?
-
[解決済み] Haskell型とデータコンストラクタ
-
[解決済み] Haskellデータ型のメモリフットプリント
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラー haskell: スコープ内にありません。どういう意味ですか?
-
[解決済み] 機能における非網羅的なパターン【重複あり
-
[解決済み] Haskellのリストを参照する際の「@」記号の意味は?
-
[解決済み] Haskellの "Just "構文とは?
-
[解決済み] GHCでコンパイルした小さなHaskellプログラムを巨大なバイナリにする
-
[解決済み] アプリケートは合成し、モナドは合成しない
-
[解決済み] Haskellの派生はどのように行われるのですか?
-
[解決済み] Real World Haskellのどの部分が今となっては時代遅れ、あるいはバッドプラクティスと考えられているのでしょうか?
-
[解決済み] パラモルフィズムとは何ですか?
-
[解決済み] foldrはどのように機能するのですか?