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 label
là loại tổng hợp
lbl1 + lbl2 + ... + lblN
và A : label → Type
là 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 label
tất cả các nhãn có thể (trong thực tế nó có thể string
hoặ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 : record
là ánh xạ từ nhãn đến các loại tùy chọn, trong đó
R lbl
có giá trị None
nếu nhãn lbl
không xuất hiện R
và giá trị Some A
nếu nó xuất hiện và có loại A
.
Nếu R : record
sau đó loại được decribed bởi R
là 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 r
loại R
là một hàm phụ thuộc sẽ đưa nhãn ℓ
thành một phần tử A
nếu ℓ
xuất hiện trong R
và cho đơn vị khác.
Tuy nhiên, một merge
hoạ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 lbl
có cùng loại trong bản ghi R
và 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 extend
hoạt động
extend : record → record → record
trong đó đối số thứ nhất ghi đè lên đối số thứ hai để extend R Q
có các trường R
bổ 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