2012-01-11 30 views
18

này có vẻ là hợp pháp:Tại sao các loại không có nhà xây dựng dữ liệu hợp lệ?

data MagazineInfo = Int String 
    deriving (Show) 

Tôi không chắc chắn nếu có một nhà xây dựng dữ liệu mặc định, nhưng các mã trên biên dịch.

Tại sao Haskell hợp lệ ở trên, vì tôi không chỉ định rõ ràng một hàm tạo giá trị?

+0

Nếu bạn đã thử sử dụng kiểu dữ liệu này bằng cách viết bộ chọn, bạn sẽ nhận thấy rằng không có 'Int' bạn có thể thoát ra ... – ShiDoiSi

Trả lời

29

Bạn có một trình tạo dữ liệu tại đó - đó là Int. Loại tên sống trong một không gian tên riêng biệt từ các nhà xây dựng dữ liệu, đó là lý do tại sao bạn không nhận được lỗi mặc dù có một loại cũng được đặt tên là Int.

+5

Và nó phổ biến cho tên hàm tạo dữ liệu giống như kiểu tên trong trường hợp, như thế này, nơi chỉ có một construtor. 'data MagazineInfo = MagazineInfo String' –

+8

Ngoài ra còn có, tuy nhiên, một thứ như [empty type] (http://www.haskell.org/haskellwiki/Empty_type) —nhưng thực sự ví dụ của poster không phải là một. Các loại trống được sử dụng kết hợp với một số kỹ thuật hệ thống kiểu tiên tiến. –

+4

Tất nhiên, đối với single-constructor, các trường hợp đơn lẻ, 'newtype' được ưu tiên hơn' data'. –

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