Gần đây tôi tình cờ thấy bài viết trên blog này của Brian McKenna giải thích về đa hình hàng. Đây dường như là một ý tưởng tuyệt vời đối với tôi, nhưng sau đó tôi nhận ra nó có mùi rất giống như đa hình tham số bị ràng buộc:
Với đa hình hàng:
sum: {x: int, y: int | rho} -> int
function sum r = r.x + r.y
Với đa hình tham số giới hạn:
sum: forall a <: {x: int, y: int}. a -> int
function sum r = r.x + r.y
Ai đó có thể làm rõ sự khác biệt về đa hình giữa hai phương pháp này?
with
công trình. Vì điều đó không được trình bày trong bài viết, tôi đã cố gắng tránh nó, bởi vì nó gây nhầm lẫn vấn đề.
forget
toán tử lấy bản ghi và xóa một trong các trường của nó. Sau đó, để gõ fun r -> forget x of r
, có lẽ bạn cũng cần đa hình hàng.
let f x = x with {sum: x.a + x.b}
với cả hai? Nếu tôi hiểu chính xác, đa hình hàng sẽ cho phép bạn giữ bất kỳ trường bổ sung nào trongx
đa hình tham số nhưng bị ràng buộc sẽ không bởi vì bạn muốn nói rằng đó là loạiforall a <: {x: int, y: int}. a -> a_with_a_new_field_sum
và tôi không nghĩ bạn có thể diễn đạta_with_a_new_field_sum
.