Câu trả lời:
Các bản ghi đơn giản tương ứng với các bản đồ thuộc loại phụ thuộc (và chúng tôi chưa có thao tác hợp nhất). Chính xác hơn, loại hồ sơ
{ lbl1 : A1, lbl2 : A2, ..., lblN : AN }
tương ứng với loại sản phẩm
∏ (ℓ : label), A ℓ
nơi labellà loại tổng hợp
lbl1 + lbl2 + ... + lblN
và A : label → Typelà họ kiểu được định nghĩa bởi
A lbl1 ≡ A1
A lbl2 ≡ A2
⋮
A lblN ≡ AN
Loại hồ sơ ở trên cũng tương đương với sản phẩm đơn giản
A1 × A2 × ⋯ × AN.
Bạn hỏi về hồ sơ mở rộng. Có ít nhất hai cách để làm điều này. Nếu không có bất kỳ công nghệ bổ sung nào, chúng tôi có thể mô hình hóa một phần mở rộng của
{ foo : A, bar : B } ≤ { foo : A, bar : B, baz C }
với một vài hàm ánh xạ giữa chúng (chiếu theo một hướng và mở rộng bởi một trường phụ ở hướng khác). Đây là tất cả rất trần tục.
Chúng tôi cũng có thể yêu cầu loại của tất cả các loại hồ sơ có thể. Giả sử chúng ta có một loại labeltất cả các nhãn có thể (trong thực tế nó có thể stringhoặc một số như vậy). Loại của tất cả các loại hồ sơ là
record ≡ label → option Type
Một phần tử R : recordlà ánh xạ từ nhãn đến các loại tùy chọn, trong đó
R lblcó giá trị Nonenếu nhãn lblkhông xuất hiện Rvà giá trị Some Anếu nó xuất hiện và có loại A.
Nếu R : recordsau đó loại được decribed bởi Rlà loại sản phẩm
∏ (ℓ : label),
match R ℓ with
| Some A ⇒ A
| None ⇒ unit
end
Điều này có nghĩa là một bản ghi rloại Rlà một hàm phụ thuộc sẽ đưa nhãn ℓthành một phần tử Anếu ℓxuất hiện trong Rvà cho đơn vị khác.
Tuy nhiên, một mergehoạt động là có vấn đề, cũng như một mối quan hệ phụ R ≤ Q. Điều này là như vậy bởi vì chúng ta không thể diễn tả thực tế rằng một nhãn lblcó cùng loại trong bản ghi Rvà bản ghi Q. Tốt nhất bạn có thể nói rằng các loại là đẳng cấu, hoặc mệnh đề bằng nhau, nhưng đó không phải là những gì bạn muốn.
Chúng ta có thể định nghĩa một extendhoạt động
extend : record → record → record
trong đó đối số thứ nhất ghi đè lên đối số thứ hai để extend R Qcó các trường Rbổ sung các trường Qđó không xuất hiện trong R:
extend R Q ≡
λ (ℓ : label),
match Q ℓ with
| Some A ⇒ Some A
| None ⇒ Q ℓ
end