2010-06-17 33 views
17

Tôi đang cố gắng thực hiện một số cấu trúc dữ liệu để giải quyết một câu đố đồ thị. Tôi đang cố gắng xác định các tiêu chí so sánh của một cạnh, nhưng tôi không chắc chắn làm thế nào. Cho đến nay:Xác định Ord của riêng bạn cho một kiểu dữ liệu (Haskell)

data Edge = Edge (Set String) Bool 

Làm thế nào để nói cho trình biên dịch biết rằng tôi muốn cạnh được khai báo bằng nhau nếu chúng có bộ giống hệt nhau của chuỗi, và không có sự bình đẳng có bất cứ điều gì để làm với các giá trị boolean?

+0

đừng quên từ khóa 'deriving'! –

Trả lời

34

Mặc dù tôi không chắc chắn lý do tại sao bạn muốn bỏ qua các giá trị boolean (Tôi tò mò), làm như vậy bạn sẽ phải xác định riêng Eq dụ của bạn; cái mặc định sẽ không hoạt động, vì nó so sánh mọi trường. May mắn thay, điều này rất dễ dàng:

instance Eq Edge where 
    (Edge s1 _) == (Edge s2 _) = s1 == s2 

Nếu bạn muốn để có thể đặt cạnh, và bạn muốn đặt hàng để so sánh chỉ là bộ quá, thực hiện của bạn là rất giống nhau:

instance Ord Edge where 
    (Edge s1 _) `compare` (Edge s2 _) = s1 `compare` s2 

Mỗi loại lớp xác định một tập hợp các phương thức nhất định cần được triển khai; Eq yêu cầu == hoặc /=Ord yêu cầu <= hoặc compare. (Để tìm ra chức năng nào là bắt buộc và tùy chọn nào, bạn có thể kiểm tra tài liệu.)

+3

Tôi bỏ qua boolean vì tôi đang làm việc với đồ thị được chỉ dẫn. Tuy nhiên, bởi vì các cạnh duy nhất quan trọng đối với tôi là các cạnh nằm giữa hai nút. Tôi đang sử dụng boolean như là một "reciprocated" lĩnh vực, vì vậy tôi có thể thoát khỏi bất kỳ cạnh đạo diễn mà không có một lợi nhuận tương đương. Sau đó tôi có thể lọc trên boolean đó để tạo ra một đồ thị vô hướng. Thật xấu xí nhưng tôi không thể nghĩ ra bất kỳ điều gì khác trong thông báo ngắn. –

9
import Data.Set 

data Edge = Edge (Set String) Bool deriving Show 

instance Eq Edge where 
    (Edge a _) == (Edge b _) = a == b 

instance Ord Edge where 
    compare (Edge a _) (Edge b _) = compare a b 
Các vấn đề liên quan