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