ファーストクラスの市民としてのタイプ


10

C ++の背景から来た理由ファーストクラスの市民として型/型式が必要な理由がわかりませんか?この機能をサポートする言語は、Aldorだけです。

ファーストクラスの市民としての型に関する文献を持っている人や、それが役立つ理由を知っている人はいますか?


3
イドリスにもこれらがあります。
ThreeFx 2016年

1
「型は値である」(さまざまな言語では「リフレクション」または「メタクラス」と呼ばれます)の一般的な概念、または型式のより具体的な概念について質問しますか?
2016年

1
@svick後者に興味があります。残念ながら、型式に関する一般的なこともあまり見つけられなかったので、文献を提案していただければ幸いです。
paul98 2016年

回答:


11

ファーストクラスのタイプは、依存型タイピングと呼ばれるものを可能にします。これらにより、プログラマは型レベルで型の値を使用できます。たとえば、整数のすべてのペアのタイプは通常のタイプですが、左の数が右の数より小さいすべての整数のペアは依存タイプです。これの標準的な導入例は、長さエンコードされたリストです(通常Vector、Haskell / Idrisで呼ばれます)。次の擬似コードはイドリスとハスケルの混合です。

-- a natural number
data Nat = Zero | Successor Nat

data Vector length typ where
  Empty : Vector Zero typ
  (::)   : typ -> Vector length typ -> Vector (Successor length) typ

このコードは、次の2つのことを示しています。

  • 空のリストの長さはゼロです。
  • cons要素をリストに入れると、長さのリストが作成されます n + 1

これは0との別の概念に非常に似てn + 1いますね。私はそれに戻ります。

これから何が得られますか?これで、使用する関数の追加のプロパティを決定できます。例:の重要なプロパティはappend、結果のリストの長さが2つの引数リストの長さの合計であることです。

plus : Nat -> Nat -> Nat
plus          Zero n = n
plus (Successor m) n = Successor (plus m n)

append : Vector n a -> Vector m a -> Vector (plus n m) a
append Empty  ys = ys
append (x::xs) ys = x :: append xs ys

しかし、全体として、この手法は日常のプログラミングですべてが役立つとは限りません。これはソケット、POST/ GETリクエストなどにどのように関係しますか?

そうではありません(少なくとも、かなりの努力がなければ)。しかし、それは他の方法で私たちを助けることができます:

依存型を使用すると、コード内で不変式を定式化できます-関数がどのように動作する必要があるかについての規則。これらを使用して、Eiffelの事前条件および事後条件と同様に、コードの動作に関する追加の安全性を取得します。これは、イドリスの可能な用途の1つである自動定理証明に非常に役立ちます。

上記の例に戻ると、長さエンコードされたリストの定義は、誘導の数学的概念に似ています。イドリスでは、次のように実際にそのようなリストに帰納の概念を定式化できます。

              -- If you can supply the following:
list_induction : (Property : Vector len typ -> Type) -> -- a property to show
                  (Property Empty) -> -- the base case
                  ((w : a) -> (v : Vector n a) ->
                      Property v -> Property (w :: v)) -> -- the inductive step
                  (u : Vector m b) -> -- an arbitrary vector
                  Property u -- the property holds for all vectors

この手法は建設的な証明に限定されていますが、それでも非常に強力です。append演習として帰納的に書くことを試みることができます。

もちろん、依存型はファーストクラス型の1つの使用法にすぎませんが、おそらく最も一般的なものの1つです。その他の用途には、たとえば、引数に基づいて関数から特定の型を返すことが含まれます。

type_func : Vector n a -> Type
type_func Empty = Nat
type_func v     = Vector (Successor Zero) Nat

f : (v : Vector n a) -> type_func v
f Empty = 0
f vs    = length vs :: Empty

これは無意味な例ですが、ファーストクラスの型なしではエミュレートできないものを示しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.