Sự khác biệt giữa đa hình hàng và đa hình giới hạn?


7

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?


2
Bạn đã thử gõ 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 trong xđ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ại forall a <: {x: int, y: int}. a -> a_with_a_new_field_sumvà tôi không nghĩ bạn có thể diễn đạt a_with_a_new_field_sum.
xavierm02

Hừm, tôi nghĩ nó phụ thuộc vào ngữ nghĩa chính xác của withcô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 đề.
vườn

1
Chà (tôi nghĩ rằng) tính biểu cảm của đa hình hàng xuất phát từ việc bạn có một tên cho "và một loạt các thuộc tính khác". Vì vậy, nếu bạn không sử dụng biến loại đại diện cho bó các thuộc tính khác trong cách gõ hàm của bạn, thì có lẽ bạn không thực sự cần đa hình hàng. Bạn cũng có thể có một số forgettoá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.
xavierm02

Không có nhiều chi tiết hơn về các hệ thống, tôi muốn nói rằng chúng gần như tương đương ngoại trừ, đa hình giới hạn là tổng quát hơn. Thông thường gõ hàng cũng ngụ ý một số thao tác cấp loại trên các hàng như liên kết hàng hoặc hạn chế hàng. Tôi nói những điều tương tự trong câu trả lời này .
Derek Elkins rời SE

Câu trả lời:


3

Vì vậy, có một vài khác biệt:

  • Trong đa hình hàng, bạn đã ràng buộc với một tên, vì vậy bạn có thể sử dụng nó ở nơi khác. Ví dụ, có thể biểu thị bằng đa hình hàng, nhưng không hoàn toàn sử dụng đa hình giới hạn. Tương tự như vậy, bạn thậm chí có thể thể hiện việc xóa trường theo cách này: là một loại đa hình hàng hợp lệ hoàn toàn hợp lệ, nhưng phân nhóm không thực sự có cách thể hiện điều này.ρforall rho . rho -> {x : int | rho}forall rho .{x : int | rho} -> rho

    Bởi vì đa hình hàng cho phép bạn thêm và xóa các trường theo cách này, thông thường nó hoạt động với ngữ nghĩa "ngăn xếp", do đó các trường cũ bị che khuất khi các trường mới cùng tên được thêm vào.

  • Subtyping giới hạn sử dụng, tốt, subtyping. Vì vậy, với đa hình hàng, bạn không thể đưa ra x : {x : int, y : int}làm đối số cho hàm kiểu {x : int} ->int. Nhưng hầu hết các hệ thống có phân nhóm giới hạn cũng sẽ có phân nhóm không đa hình, điều đó sẽ cho phép điều này, vì hầu hết các hệ thống đều có {x : int} <: {x : int, y : int}.

Phân nhóm bị ràng buộc có xu hướng chính xác và linh hoạt hơn một chút, và ngữ nghĩa "chồng" của đa hình hàng không phát sinh nhiều như vậy. Nhưng suy luận dễ dàng hơn nhiều đối với đa hình hàng và có thể hoạt động trong trường hợp không có bất kỳ chú thích loại nào (ví dụ, trong Elm ), thường không phải là trường hợp có sự phân nhóm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.