2010-08-26 31 views
9

D có 'newtype' (như trong Haskell) không.D có 'newtype' không?

Đó là một câu hỏi ngây thơ, vì tôi chỉ lướt qua D, nhưng Google không bật lên bất cứ điều gì hữu ích.

Trong Haskell, đây là cách để tạo các kiểu khác nhau của cùng một điều khác biệt tại thời gian biên dịch, nhưng không phát sinh bất kỳ hình phạt hiệu suất thời gian chạy nào.

ví dụ: bạn có thể làm cho newtypes (tăng gấp đôi) cho mét, giây và kg. Điều này sẽ sai tại thời gian biên dịch nếu chương trình của bạn thêm một số lượng tính bằng mét vào một số lượng tính bằng giây, nhưng sẽ nhanh như thời gian chạy như thể cả hai đều tăng gấp đôi (chúng ở thời gian chạy).

Nếu D không có cái gì đó tương tự như 'newtype', các phương pháp được chấp nhận để xử lý với số lượng kích thước là gì?

Xin cảm ơn,

Chris.

+0

Một lớp bao bọc mỏng với quá tải toán tử approriate có thể hoàn thành công việc và được tối ưu hóa. Nhưng đó chỉ là một dự đoán và một giải pháp khá xấu xí. – delnan

+1

@delnan: Trong D, bạn có thể sử dụng cấu trúc chứ không phải lớp. – dsimcha

+0

Trong một khoảnh khắc tôi nghĩ: "newtype? .... như trong Gundam ????" XD – Klaim

Trả lời

12

Trong D1.0 có typedef, đây là cách gõ mạnh từ loại được xác định trước đến 'kiểu mới'.

D2.0 đã xóa bí danh này và chỉ còn lại (những gì typedef là trong C). Có nói về việc có một mẫu trình bao bọc có thể tạo ra một kiểu mới mạnh mẽ.

Vấn đề với typedef là có các đối số tốt để làm cho loại mới là loại phụ của loại được xác định trước và cũng là đối số tốt để biến nó thành kiểu siêu.

Ngữ nghĩa của typedef là loại cơ sở được chuyển đổi hoàn toàn sang kiểu mới, nhưng newtype không được chuyển đổi thành loại cơ sở hoặc các loại khác có cùng loại cơ sở. Tôi đang sử dụng loại cơ sở tại đây từ:

typedef int Fish; 
typedef Fish Cat; 
Fish gold = 1; 
Cat fluff = gold; 

Sẽ không biên dịch được.

Và ngay bây giờ, 2.048 DMD vẫn cho phép sử dụng typedef (nhưng không sử dụng nó).

Có loại cơ sở chuyển sang Newtype là hữu ích, do đó bạn không cần phải viết

meters = cast(meters) 12.7; 
+1

Trong 'typedef X Y', nếu' X' được chuyển đổi hoàn toàn vào hoặc từ 'Y', thì' typedef' không giống với 'newtype' của Haskell. –

+0

@Đọc Barton, tôi đã chấp nhận câu trả lời này như một câu trả lời "không có nó không". – fadedbee

+0

@he_the_great, các đối số có lợi cho loại mới là siêu kiểu là gì? Chúng ta có thể có cả subtypedef và supertypedef trong ngôn ngữ? – fadedbee

6

Funny, như he_the_great đề cập, D1 có mạnh typedef nhưng không ai sử dụng nó, có thể bởi vì nó đã không thể để tùy chỉnh ngữ nghĩa chính xác cho từng trường hợp. Có lẽ cách đơn giản nhất để xử lý tình huống này, ít nhất là đối với các kiểu nguyên thủy, bao gồm một mẫu mixin ở đâu đó trong Phobos, cho phép bạn chuyển tiếp tất cả các toán tử nhưng có boilerplate để làm điều này được tạo tự động thông qua mixin. Sau đó, bạn chỉ cần tạo một cấu trúc bao bọc và được tất cả các thiết lập.