C ++の背景から来た理由ファーストクラスの市民として型/型式が必要な理由がわかりませんか?この機能をサポートする言語は、Aldorだけです。
ファーストクラスの市民としての型に関する文献を持っている人や、それが役立つ理由を知っている人はいますか?
C ++の背景から来た理由ファーストクラスの市民として型/型式が必要な理由がわかりませんか?この機能をサポートする言語は、Aldorだけです。
ファーストクラスの市民としての型に関する文献を持っている人や、それが役立つ理由を知っている人はいますか?
回答:
ファーストクラスのタイプは、依存型タイピングと呼ばれるものを可能にします。これらにより、プログラマは型レベルで型の値を使用できます。たとえば、整数のすべてのペアのタイプは通常のタイプですが、左の数が右の数より小さいすべての整数のペアは依存タイプです。これの標準的な導入例は、長さエンコードされたリストです(通常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
これは無意味な例ですが、ファーストクラスの型なしではエミュレートできないものを示しています。