2014-08-28 16 views
8

Tôi hiểu lý do tại sao role system and annotations yêu cầu thông số gia đình loại (và dữ liệu) mới có vai trò nominal.Vai trò và nhóm dữ liệu danh nghĩa

Vì vậy, tôi mong đợi khi tôi tuyên bố

data family CoordinateRepresentation ty a :: * 

rằng tya sẽ nhận được nominal vai trò. (Ví dụ thực tế của tôi là một gia đình dữ liệu liên quan, nhưng vì tôi không nghĩ rằng nó thay đổi bất cứ điều gì tôi bỏ qua thêm tiếng ồn đi kèm với điều đó.)

Điều tôi không mong đợi là khi tôi đổi nó thành

data family CoordinateRepresentation ty :: * -> * 

là đối số loại thứ hai chưa được đặt tên vẫn nhận được vai trò nominal.

Tại sao điều này? Nó có thể không an toàn có được một vai trò representational, bởi vì không phải bất kỳ data instance CoordinateRepresentation ... = ... phải tạo ra một nhà xây dựng mới? Làm thế nào mà nhà xây dựng đó có cơ hội sử dụng tham số của nó tại một vai trò nominal theo cách mà trình biên dịch không thể nhìn thấy? Mặc dù đó là một hệ thống mở và có biên dịch riêng biệt, tôi vẫn không hiểu.

Trả lời

6

Là điểm đầu tiên, nhỏ: Liệu một họ dữ liệu được khai báo với các biến kiểu hoặc chữ ký loại hiện tại là hoàn toàn phi vật chất, chúng chỉ là các cú pháp khác nhau cho cùng một điều. Từ the GHC User's Guide trên tờ khai gia đình dữ liệu:

Cũng như với GADT declarations đối số được đặt tên là hoàn toàn không bắt buộc, [...]

Điểm chính vẫn còn, và đã được thảo luận trong this GHC trac thread. Tóm tắt ngắn gọn: Có thể, bằng cách thêm chú thích vai trò và/hoặc chú thích vai trò cho các họ dữ liệu/kiểu, nhưng nó chưa được thực hiện.

+0

Ah, tôi hiểu. Tôi hy vọng rằng cú pháp thứ hai sẽ giới hạn phần "khớp mẫu" của họ kiểu đối số đầu tiên và yêu cầu kết quả '* -> *' có nghĩa là "bình thường", nhưng đó không phải là trường hợp. –

Các vấn đề liên quan