Gibt es einen Unterschied zwischen erweiterbaren Datensätzen und abhängigen Karten?


7

In einer typisierten Einstellung können Datensätze als Karte von Feld zu Typ betrachtet werden. Gibt es einen echten Unterschied zwischen dem resultierenden Typ und einer abhängigen Karte in einer abhängig typisierten Sprache, wenn es eine gut typisierte Zusammenführungsoperation für Datensätze gibt (die überlappende Felder zulässt)?

Antworten:


6

Einfache Datensätze entsprechen Karten vom abhängigen Typ (und wir haben noch keine Zusammenführungsoperation). Genauer gesagt, der Datensatztyp

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

entspricht dem Produkttyp

∏ (ℓ : label), A ℓ

Wo labelist der Summentyp?

lbl1 + lbl2 + ... + lblN

und A : label → Typeist die Typfamilie definiert durch

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

Der obige Datensatztyp entspricht auch dem einfachen Produkt

A1 × A2 × ⋯ × AN.

Sie haben nach erweiterbaren Datensätzen gefragt. Es gibt mindestens zwei Möglichkeiten, dies zu tun. Ohne zusätzliche Technologie können wir eine Erweiterung von modellieren

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

mit ein paar Funktionen, die zwischen ihnen abgebildet werden (Projektion in eine Richtung und Erweiterung um ein zusätzliches Feld in der anderen). Das ist alles sehr banal.

Wir könnten auch nach dem Typ aller möglichen Datensatztypen fragen. Angenommen, wir haben eine Art labelaller möglichen Etiketten (in der Praxis könnte es sein stringoder so). Der Typ aller Datensatztypen ist

record ≡ label → option Type

Ein Element R : recordist eine Zuordnung von Beschriftungen zu optionalen Typen, wobei R lblWert verwendet wird, Nonewenn Beschriftung lblnicht in angezeigt wird, und RWert, Some Awenn sie angezeigt wird und Typ hat A.

Wenn R : recorddann der beschriebene Typ der Produkttyp Rist

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

Dies bedeutet, dass ein Datensatz rvom Typ Reine abhängige Funktion ist, die eine Beschriftung für ein Element von Aif in Rund für die Einheit andernfalls verwendet.

Eine mergeOperation ist jedoch problematisch, ebenso wie eine Subtypisierungsbeziehung R ≤ Q. Dies liegt daran, dass wir nicht ausdrücken können, dass ein Label lblin Datensatz Rund Datensatz denselben Typ hat Q. Bestenfalls kann man sagen, dass die Typen isomorph oder aussagekräftig sind, aber das ist nicht das, was Sie wollen.

Wir können eine extendOperation definieren

extend : record → record → record

in dem das erste Argument das zweite überschreibt, so dass extend R Qdie Felder von Rzusätzlich die Felder davon Qnicht erscheinen in R:

extend R Q ≡
   λ (ℓ : label),
     match Q ℓ with
     | Some A ⇒ Some A
     | None ⇒ Q ℓ
     end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.