Tôi đang tìm kiếm một khái niệm trong lý thuyết loại mà tôi chắc chắn có thể đã được khám phá, nhưng không biết tên đằng sau.
Chúng ta hãy xem xét một ngôn ngữ giống như ML với các loại sản phẩm và tổng và hệ thống loại giống như Hindley-Milner. Tôi sẽ sử dụng cú pháp OCaml.
Tôi đang tự hỏi về cách hai giá trị khác nhau có thể khác nhau.
Sử dụng
Trường hợp sử dụng của tôi là viết các thông báo lỗi "rõ ràng hơn" trong thư viện giống như xUnit: nếu hai giá trị khác nhau khi chúng được dự kiến là bằng nhau, điều này có thể giúp xây dựng một thông báo rõ ràng hơn:
Trước:
Giá trị khác nhau: dự kiến
{x = [1;2;3;4], y = "a long string"}
, có{x = [1;2;3;3], y = "a long string"}
Sau:
Giá trị khác nhau: tại vị trí
.x[3]
, dự kiến 4, có 3.
(có thể có mối quan hệ với các ống kính chức năng vì cuối cùng chúng ta sẽ xây dựng một ống kính thành một giá trị nhỏ hơn khác nhau).
Các loại sản phẩm
Ví dụ:
type p =
{ x : int
; y : string
}
Bình đẳng có thể được định nghĩa là:
let equal a b =
equal_int a.x b.x && equal_string a.y b.y
Nhưng nó cũng có thể xác định sự khác biệt:
type delta_p =
| Equal
| Diff_x of int * int
| Diff_y of string * string
let diff_p a b =
if not (equal_int a.x b.x) then
Diff_x (a.x, b.x)
else if not (equal_string a.y b.y) then
Diff_y (a.y, b.y)
else
Equal
(có thể có ý nghĩa khi định nghĩa một delta_int
loại như int * int
thể hiện rằng nó là đệ quy)
Các loại tổng
Đối với loại tổng có nhiều cách khác nhau: có một hàm tạo khác nhau hoặc một giá trị khác
type s = X of int | Y of string
type ctor_s =
| Ctor_X
| Ctor_Y
type delta_s =
| Equal
| Diff_ctor of ctor_s * ctor_s
| Diff_X of int * int
| Diff_Y of string * string
let diff_s a b = match (a, b) with
| X xa, X xb ->
if equal_int xa xb then
Equal
else
Diff_X (xa, xb)
| (* Y case similar *)
| X _, Y _ -> Diff_ctor (Ctor_X, Ctor_Y)
| Y _, X _ -> Diff_ctor (Ctor_Y, Ctor_X)
Tên của khái niệm này là gì? Tôi có thể tìm hiểu thêm về điều này ở đâu?
Cảm ơn!