2011-08-16 25 views

Trả lời

14

Cách tốt nhất là chỉ thêm deriving (Eq, Ord) vào định nghĩa của loại.

Vì bạn đã liệt kê các hàm tạo của mình theo thứ tự tăng dần, cá thể Ord bắt nguồn sẽ cung cấp cho bạn chính xác thứ tự bạn muốn.

Tuy nhiên, nếu thay đổi thứ tự trong định nghĩa không phải là một tùy chọn vì một lý do nào đó bạn vẫn có thể lấy được phương trình, vì thứ tự đó không quan trọng. Cho một thể hiện của phương trình, chúng ta có thể viết một thể hiện cho Ord. Cách gọn gàng nhất để xác định so sánh có thể là đánh vần tất cả các kết hợp mà so sánh sẽ trả về LT và sau đó chỉ cần sử dụng so sánh x y | x == y = Eq; so sánh _ _ = GT cho các kết hợp còn lại.

+0

Cảm ơn, tôi đã không biết rằng thứ tự được bảo tồn. – LennyStackOverflow

+0

Câu hỏi tiền thưởng: nếu lệnh trong definiton không phản ánh thứ tự số? – LennyStackOverflow

+2

@Lenny: Sau đó, bạn đã khởi tạo Ord và xác định 'so sánh' bằng tay (giả sử rằng việc thay đổi thứ tự trong định nghĩa không phải là một tùy chọn vì lý do nào đó) - bạn vẫn có thể lấy được Eq mặc dù vì thứ tự đó không thành vấn đề . Cách gọn gàng nhất để xác định 'so sánh' có lẽ là đánh vần tất cả các kết hợp mà so sánh sẽ trả về LT và sau đó chỉ đơn giản là sử dụng' so sánh x y | x == y = Eq; so sánh _ _ = GT' cho các kết hợp còn lại. – sepp2k

3

Như đã đề cập, bạn có thể lấy được EqOrd. Hoặc bạn có thể lấy được Enum và sau đó làm

instance Eq Rating where 
    x == y = fromEnum x == fromEnum y 

Hoặc chỉ cần đánh vần từ đó tất cả ra

instance Eq Rating where 
    OneStar == OneStar = True 
    TwoStar == TwoStar = True 
... 
    _ == _ = False 
Các vấn đề liên quan