2012-05-17 35 views
13
data Ray = Ray Vector Vector 

hoặcHaskell: Dữ liệu đại số vs tuple

type Ray = (Vector, Vector) 

nào được ưa thích trong Haskell thành ngữ? Tại sao tôi nên sử dụng cái kia?
Tôi không quan tâm đến hiệu suất.

Có vẻ như để làm cho ít sự khác biệt với các chức năng, ví dụ:

trace :: Ray -> … 

trace (Ray x d) = … 
-- OR 
trace (x, d) = … 

Trả lời

10

Phiên bản data được ưa thích vì nó cho thấy rõ hơn mục đích của các lập trình viên - bằng cách tạo ra một loại mới, bạn được chỉ ra cho tất cả rằng đây không chỉ đơn thuần là một tuple, mà là một thực thể ngữ nghĩa có ý nghĩa, là Ray.

Điều đó sau đó giúp bạn có thể dựa vào hệ thống kiểu hơn nữa, với các trường hợp tùy chỉnh cho Ray và tối ưu hóa không thể có trong bộ dữ liệu.

+1

Phải. Và một điểm quan trọng về các loại: chúng không chỉ là biểu diễn dữ liệu; chúng mô tả cấu trúc hữu ích. – pigworker

+0

Được rồi, điều đó có ý nghĩa. 'type' thực sự chỉ dành cho một từ đồng nghĩa, không phải là một kiểu dữ liệu mới. Nhưng dòng này phải được vẽ ở đâu đó - 'type Color = (Int, Int, Int) 'sẽ thích hợp, đúng không? – mk12

+2

Không, vì lý do hiệu suất, nó có ý nghĩa hơn khi có loại véc-tơ đóng gói cho Màu, như trong gói màu - các loại có ý nghĩa như thế này có thể được tối ưu hóa và chuyên biệt. http://hackage.haskell.org/packages/archive/colour/2.3.3/doc/html/src/Data-Colour-Internal.html#Colour –

6

Bạn cũng có thể cân nhắc một lựa chọn thứ ba là loại kết hợp cả hai: newtype

newtype Ray = Ray (Vector, Vector) 

kiểu dữ liệu đại số, theo ý kiến ​​của tôi, được sử dụng trong các tình huống khi bạn có nhiều lựa chọn thay thế, hoặc trong trường hợp khi bạn cần loại được đệ quy, có chứa chính nó. Nhưng nó có thể là quá mức cần thiết cho một cái gì đó như thế này.

Don Stewart đã chỉ ra rằng việc tạo một từ đồng nghĩa loại thành bộ tuple cũng giống như sử dụng loại bộ dữ liệu đó trực tiếp; loại từ đồng nghĩa không có danh tính của riêng mình. Vì vậy, trình kiểm tra loại sẽ không thể phân biệt giữa loại của bạn và một bộ tuple và do đó, nó không thể kiểm tra xem bạn có đang sử dụng loại mà bạn muốn hay không. Ngoài ra, nó sẽ có các trường hợp giống hệt như một bộ tuple.

A newtype cho phép bạn sử dụng cùng loại cơ bản như bộ dữ liệu; nhưng đó là một loại riêng biệt cho trình kiểm tra loại, với các trường hợp riêng biệt.

+0

Điều này có vẻ ít phổ biến hơn so với sử dụng biểu mẫu đã kết hôn. Có lẽ chỉ vì nó là dấu chấm câu nhiều hơn. – luqui

3

Một lựa chọn thứ tư tôi thấy khá thuận tiện là hồ sơ:

data Ray = Ray { from, to :: Vector } 

Họ có về cơ bản tất cả các tính năng của ADTs "bình thường", nhưng với một số đường cú pháp bổ sung. Đặc biệt là họ làm cho nó dễ dàng hơn để có được một phần bản sao sửa đổi của một giá trị. Đúng là các bản ghi quá giới hạn trong một số trường hợp, nhưng sau đó bạn có thể tiếp tục với "phiên bản cải tiến" như fclabels.

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