質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

1回答

815閲覧

[Haskell] DataKinds 型と種について

退会済みユーザー

退会済みユーザー

総合スコア0

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

0グッド

0クリップ

投稿2019/02/21 17:05

前提

DataKindsを使ったソースコードを眺めていたら頭がわかりそうでわからないので質問します.
わからないところを説明するにあたって変なことを言っているかもしれないので,間違っていたら指摘をお願いします.

ソースコード

Nat型は0以上の整数値を表現できます.
Vector型コンストラクタは長さの型と実際にもつ情報の型を受け取ります.

Haskell

1{-# LANGUAGE DataKinds #-} 2{-# LANGUAGE GADTs #-} 3{-# LANGUAGE KindSignatures #-} 4 5data Nat 6 = Zero 7 | Succ Nat 8 9data Vector (n :: Nat) a where 10 VNil :: Vector 'Zero a 11 VCons :: a -> Vector n a -> Vector ('Succ n) a 12

考えていること

正直全くついていけないのですが,

Vectorの定義における(n :: Nat)のNatは[nがどの種なのか]を表しているのでしょうか?
  • 種はいままでの知っている知識では * や * -> * のことだと思っています.
  • ここでのNatも * や * -> * と同じ存在(すなわち種)という認識でいいのでしょうか?.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すべてご認識の通りです。 DataKinds という拡張はまさにそのように、Natという本来であればただの型でしかないものを種として扱えるようにして、ZeroSuccなどの、本来であればNat型の値でしかないものを「Nat種の型」として扱えるようにするためのものです。

そして、n :: Nat という表記はKindSignaturesという拡張が可能にするもので、
通常型引数の種が*になるところを、n :: Nat等のように書くことで、他の種にすることができるようにしてくれます。

Vectorの定義における(n :: Nat)のNatは[nがどの種なのか]を表しているのでしょうか?

  • 種はいままでの知っている知識では * や * -> * のことだと思っています.
  • ここでのNatも * や * -> * と同じ存在(すなわち種)という認識でいいのでしょうか?.

投稿2019/02/21 23:46

編集2019/02/21 23:47
igrep

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/22 02:31

回答ありがとうございます.値が型になるのはすごいですね.今思った疑問なのですが,Zeroが型ということは,Zero型の値というのは存在するのでしょうか?
igrep

2019/02/22 05:21 編集

残念ながらありません。 ZeroやSuccをラップした型(「singleton types」と呼ばれます)を作ることで、間接的に扱うことは出来ますが。 例えばNatの場合GADTsを使って、下記のように定義することで、SZeroは必ずSNat Zeroという型の値になります。(コメントの制約上、インデントがなくなってしまいます点はご容赦を) data SNat (a :: Nat) where SZero :: SNat 'Zero SSucc :: SNat n -> SNat ('Succ n)
退会済みユーザー

退会済みユーザー

2019/02/22 16:48

ありがとうございます.こういうのをスラスラ書けるようになりたいですね.精進します.
igrep

2019/02/23 03:01

一点捕捉すると、「singleton types」の定義は基本的にラップする対象の型と完全に同じような定義になるので、 http://hackage.haskell.org/package/singletons というパッケージを使って自動生成する(あるいは、よく使う型はすでに生成済みなのでそれを使う)ことが多いです。 なので、仕組みを理解するとき以外に自分で書く必要はないでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問