Existe alguma diferença entre registros extensíveis e mapas dependentes

7

Em uma configuração digitada, os registros podem ser considerados um mapa de um campo para o outro. Se houver uma operação de mesclagem de registro bem digitada (que permita campos sobrepostos), existe alguma diferença real entre o tipo resultante e um mapa dependente em um idioma digitado de forma dependente?

Alex R
fonte

Respostas:

6

Registros simples correspondem a mapas do tipo dependente (e ainda não temos uma operação de mesclagem). Mais precisamente, o tipo de registro

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

corresponde ao tipo de produto

∏ (ℓ : label), A ℓ

onde labelé o tipo de soma

lbl1 + lbl2 + ... + lblN

e A : label → Typeé a família de tipos definida por

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

O tipo de registro acima também é equivalente ao produto simples

A1 × A2 × ⋯ × AN.

Você perguntou sobre registros extensíveis. Existem pelo menos duas maneiras de fazer isso. Sem nenhuma tecnologia adicional, podemos modelar uma extensão de

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

com algumas funções que mapeiam entre elas (projeção em uma direção e extensão por um campo extra na outra). Tudo isso é muito mundano.

Também poderíamos pedir o tipo de todos os tipos de registro possíveis. Suponha que tenhamos um tipo labelde todos os rótulos possíveis (na prática, poderia ser stringou algo parecido). O tipo de todos os tipos de registro é

record ≡ label → option Type

Um elemento R : recordé um mapeamento de rótulos para tipos opcionais, onde R lblassume valor Nonese o rótulo lblnão aparece Re valor Some Ase ele aparece e tem tipo A.

Se, R : recordentão, o tipo descrito por Ré o tipo de produto

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

Isso significa que um registro rdo tipo Ré uma função dependente que leva um rótulo a um elemento de Ase aparecer na Runidade e de outra forma.

No entanto, uma mergeoperação é problemática, bem como uma relação de subtipagem R ≤ Q. Isso ocorre porque não podemos expressar o fato de que uma gravadora lbltem o mesmo tipo de registro Re registro Q. Na melhor das hipóteses, você pode dizer que os tipos são isomórficos ou proposicionalmente iguais, mas não é isso que você deseja.

Nós podemos definir uma extendoperação

extend : record → record → record

em que o primeiro argumento substitui o segundo, para que extend R Qos campos Radicionalmente Qnão sejam exibidos em R:

extend R Q ≡
   λ (ℓ : label),
     match Q ℓ with
     | Some A ⇒ Some A
     | None ⇒ Q ℓ
     end
Andrej Bauer
fonte