Tôi đã nghĩ một chút về điều này. Vấn đề chính là nói chung, chúng ta không biết giá trị của loại đa hình lớn đến mức nào. Nếu bạn không có thông tin này, bạn phải lấy nó bằng cách nào đó. Monomorp4ation lấy thông tin này cho bạn bằng cách chuyên đi đa hình. Quyền anh có được thông tin này cho bạn bằng cách đưa mọi thứ vào một đại diện có kích thước đã biết.
Một cách khác thứ ba là theo dõi thông tin này trong các loại. Về cơ bản, những gì bạn có thể làm là giới thiệu một loại khác nhau cho từng kích thước dữ liệu và sau đó các hàm đa hình có thể được xác định trên tất cả các loại có kích thước cụ thể. Tôi sẽ phác thảo một hệ thống như vậy dưới đây.
KindsType constructorsκA::=n::=|∀a:κ.A|α|A×B|A+B|A→BrefA|Pad(k)|μα:κ.A
Ở đây, ý tưởng cấp cao là loại của một loại cho bạn biết cần bao nhiêu từ để bố trí một đối tượng trong bộ nhớ. Đối với bất kỳ kích thước nhất định, thật dễ dàng để được đa hình trên tất cả các loại kích thước cụ thể đó. Vì mọi loại - ngay cả loại đa hình - vẫn có kích thước đã biết, việc biên dịch không khó hơn so với C.
Các quy tắc sắp xếp biến tiếng Anh này thành toán học và sẽ trông giống như thế này:
α:n∈ΓΓ⊢α:nΓ,α:n⊢A:mΓ⊢∀α:n.A:m
Γ⊢A:nΓ⊢B:mΓ⊢A×B:n+mΓ⊢A:nΓ⊢B:nΓ⊢A+B:n+1
Γ⊢A:mΓ⊢B:nΓ⊢A→B:1Γ⊢A:nΓ⊢refA:1
Γ⊢Pad(k):kΓ,α:n⊢A:nΓ⊢μα:n.A:n
Vì vậy, bộ định lượng forall yêu cầu bạn đưa ra loại bạn đang sử dụng. Tương tự như vậy, ghép nối là loại cặp không có hộp, chỉ đặt ra một bên cạnh trong bộ nhớ (như kiểu cấu trúc C). Các hiệp hội rời rạc lấy hai giá trị có cùng kích thước và sau đó thêm một từ cho thẻ phân biệt đối xử. Các hàm là các bao đóng, được biểu diễn như bình thường bằng một con trỏ tới bản ghi môi trường và mã.A BA×BAB
Tài liệu tham khảo rất thú vị - con trỏ luôn là một từ, nhưng chúng có thể trỏ đến các giá trị ở bất kỳ kích thước nào. Điều này cho phép các lập trình viên thực hiện
đa hình cho các đối tượng tùy ý bằng quyền anh, nhưng không yêu cầu
họ làm như vậy. Cuối cùng, một khi các kích thước rõ ràng đang hoạt động, việc giới thiệu một loại đệm, sử dụng không gian nhưng không làm gì cả thường rất hữu ích. (Vì vậy, nếu bạn muốn sử dụng liên kết rời rạc của một int và một cặp int, bạn sẽ cần thêm phần đệm int đầu tiên, để bố cục đối tượng được thống nhất.)
Các kiểu đệ quy có quy tắc hình thành tiêu chuẩn, nhưng lưu ý rằng các lần đệ quy phải có cùng kích thước, điều đó có nghĩa là bạn thường phải dán chúng vào một con trỏ để thực hiện công việc phân loại. Ví dụ, kiểu dữ liệu danh sách có thể được biểu diễn dưới dạng
μα:1.ref(Pad(2)+int×α)
Vì vậy, điều này trỏ đến một giá trị danh sách trống, hoặc một cặp int và một con trỏ đến một danh sách liên kết khác.
Kiểm tra loại cho các hệ thống như thế này cũng không khó lắm; thuật toán trong bài báo ICFP của tôi với Joshua Dunfield, Đánh máy hai chiều hoàn chỉnh và dễ dàng cho Đa hình bậc cao áp dụng cho trường hợp này mà hầu như không có thay đổi.