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.
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
Đượ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
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 –