Đến với Haskell từ một nền trong các ngôn ngữ OO khác nhau, một điều có vẻ như một nhược điểm đối với tôi là hàm và tên trường không bị scoped được liên kết với, vì vậy thật dễ dàng để chạy vào các xung đột nếu các kiểu dữ liệu khác nhau có các trường có cùng tên.Tên xung đột giữa các nhãn trường của các kiểu dữ liệu khác nhau trong Haskell
Nếu tôi đã ba module:
module One where
data Foo a = Foo { value :: a }
----
module Two where
data Bar a = Bar { value :: a }
----
module Three where
import One
import Two
foo = Foo { value = 42 } -- compile error here
n = value foo -- and here
tài liệu tham khảo không đủ tiêu chuẩn để value
trong mô-đun Three
được coi là mơ hồ mặc dù chỉ là một trong hai tên nhập khẩu có ý nghĩa trong bối cảnh này. (Trong một ngôn ngữ OO, tham chiếu đến foo.value
và bar.value
sẽ rõ ràng.)
Tất nhiên tôi có thể làm mất uy tín bằng cách viết Foo { One.value = 42 }
, nhưng trông có vẻ khó xử. Tôi cũng có thể đặt tên cho các trường khác nhau, ví dụ: "fooValue" và "barValue", nhưng dự phòng trong Foo { fooValue = 42 }
cũng có vẻ khó xử.
Đây thực sự là trường hợp đặc biệt của vấn đề tổng quát hơn về chức năng trong các mô-đun khác nhau có cùng tên nhưng hoạt động trên các loại khác nhau, không liên quan. Tôi dường như chạy vào nó thường xuyên hơn với tên trường, mặc dù. Ví dụ, tôi có một số kiểu dữ liệu, không liên quan đến một loại lớp nhưng thường được sử dụng cùng nhau, có chứa các giá trị màu, vì vậy tôi muốn mỗi một có một trường có tên là "màu".
Nhà phát triển Haskell có kinh nghiệm đặt tên cho mọi thứ và sắp xếp chúng thành các mô-đun để tránh tình huống này như thế nào?
Điểm nhỏ: bạn đang thiếu hàm tạo trong định nghĩa 'Bar'. –
@Travis Brown: Rất tiếc, đó là lỗi đánh máy. Cảm ơn đã chỉ ra điều đó. – Wyzard