2014-06-22 17 views
26

Tôi có mã này và nó sẽ không biên dịch, làm nổi bật quyền x và y của Point3 và viết: "Nhiều khai báo của x" và "Nhiều khai báo của y". Chuyện gì vậy? Không thể Point2 và Point3 có cùng tên thành viên?Nhiều khai báo của x

data Point2  = Point2 {x :: Float, y :: Float} 
data Point3  = Point3 {x :: Float, y :: Float, z :: Float} 

Trả lời

38

Không, tính năng này hiện không được hỗ trợ. Cách tiếp cận tiêu chuẩn là tiền tố mỗi trường với một cái gì đó duy nhất cho kiểu dữ liệu cụ thể, ví dụ: p2x, p2y, p3x v.v.

Lý do không được hỗ trợ là mỗi tên trường bản ghi ngầm tạo ra một hàm "công cụ chọn", ví dụ: x :: Point2 -> Float. Có hai trường có cùng tên trong cùng một phạm vi sẽ tạo ra xung đột.

Đây là một bugbear lâu đời cho nhiều người và sẽ được giải quyết bằng phần mở rộng ngôn ngữ sắp tới OverloadedRecordFields, hy vọng sẽ là một phần của GHC 7.12 (đầu năm 2016).

Khi được bật, tiện ích mở rộng này sẽ cho phép cùng một tên trường được sử dụng trong nhiều bản ghi. Bộ chọn trường sẽ có loại quá tải thường sẽ được giải quyết theo kiểu suy luận.

+2

Pity chúng ta không có giải pháp cho trường hợp này. – jiyinyiyong

+0

... nhưng sau đó mục đích của 'DisambiguateRecordFields' là gì? –

3

Mở rộng DuplicateRecordFields cho phép bản ghi Haskell hiện có sử dụng nhãn trường trùng lặp.

Xem DuplicateRecordFields

OverloadedRecordFields không làm việc cho tôi với GHC 8.0.2-

+0

Cảm ơn, tôi đoán tôi nên xem xét các ghi chú phát hành GHC. Đây là một trong những khiếu nại số 1 của tôi! –

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