拡張可能なレコードと依存マップの間に違いはありますか


7

型付き設定では、レコードはフィールドから型へのマップと考えることができます。適切に型付けされたレコードマージ操作(フィールドのオーバーラップを可能にする)がある場合、結果の型と従属的に型付けされた言語の従属マップの間に実際の違いはありますか?

回答:


6

単純なレコードは依存型のマップに対応します(まだマージ操作はありません)。より正確には、レコードタイプ

{ lbl1 : A1, lbl2 : A2, ..., lblN : AN }

製品タイプに対応

∏ (ℓ : label), A ℓ

label合計タイプはどこですか

lbl1 + lbl2 + ... + lblN

A : label → Type定義されるタイプファミリーです

A lbl1 ≡ A1
A lbl2 ≡ A2
       ⋮
A lblN ≡ AN

上記のレコードタイプも単純な製品と同等です

A1 × A2 × ⋯ × AN.

拡張可能なレコードについて尋ねました。これを行うには、少なくとも2つの方法があります。追加のテクノロジーがなくても、

{ foo : A, bar : B } ≤ { foo : A, bar : B, baz C }

それらの間でマッピングする2つの関数を使用します(1つの方向への投影と、もう1つの方向での追加フィールドによる拡張)。これはすべて非常に平凡です。

すべての可能なレコードタイプのタイプを要求することもできます。label考えられるすべてのラベルのタイプがあるとします(実際には、そのようなラベルがstringいくつかあります)。タイプのすべてのレコードタイプがあります

record ≡ label → option Type

要素はR : record、ラベルからオプションタイプへのマッピング、ある R lbl値をとるNoneラベルがあればlbl表示されないRと値Some Aが表示された場合とタイプを持っていますA

場合はR : record、その後でdecribedタイプはR、製品の種類があります

∏ (ℓ : label),
  match R ℓ with
  | Some A ⇒ A
  | None ⇒ unit
  end

これはr、タイプのレコードがR依存関数であり、ラベルAifの要素に出現しR、それ以外の場合はユニットに出現することを意味します。

ただし、merge操作には問題があり、サブタイプの関係もありR ≤ Qます。これは、ラベルlblがレコードRとレコードで同じタイプであることを表現できないためQです。せいぜいあなたは型が同型であるか命題的に等しいと言うことができますが、それはあなたが望むものではありません。

私たちはできる定義extend操作を

extend : record → record → record

ここで、最初の引数 2番目の引数をオーバーライドするため、次extend R Qのフィールドには表示されないフィールドがR追加さQRます。

extend R Q ≡
   λ (ℓ : label),
     match Q ℓ with
     | Some A ⇒ Some A
     | None ⇒ Q ℓ
     end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.