2010-07-05 36 views
8

Giả sử tôi có x :: [(n, a)] trong đó n là một số và một mục không thể đặt hàng (không thuộc loại Ord).Sắp xếp Haskell của danh sách không thể đặt hàng bằng cách sử dụng lệnh proxy

Tôi muốn sắp xếp danh sách này theo n.

Tôi không thể làm sort x vì không thể đặt hàng a. Tôi có thể thay thế a theo chỉ mục và sau đó lắp ráp danh sách mới bằng cách sử dụng !! nhưng điều này có vẻ như một giải pháp kém.

Giải pháp thay thế?

Trả lời

12

Ugh. Đừng bận tâm. sortBy.

+10

không chỉ 'sortBy' nhưng' sortBy (so sánh fst) '(trong trường hợp bạn chưa từng nghe đến hàm' comparison'). –

+0

'so sánh' nằm trong' Data.Ord'. (Nhưng bạn biết điều đó, bởi vì bạn đã sử dụng hoogle.) – Yitz

+3

[Hoogle] (http://haskell.org/hoogle)? Thật tuyệt, tôi luôn hỏi Neil Mitchell mỗi lần tôi cần biết chức năng ở đâu ... –

5

Bạn muốn

sortBy (compare `on` fst) 

hoặc một cái gì đó tương tự. Bạn sẽ tìm thấy on được xác định trong mô-đun Data.FunctionsortBy trong Data.List, mà bạn sẽ cần phải nhập.

+0

Chỉ cần theo dõi, cách sử dụng thông thường hơn là tận dụng định nghĩa: so sánh = khi so sánh Không mâu thuẫn với Tiến sĩ Ramsey bao la giỏi hơn, chỉ ra một phong cách thông thường hơn. – BMeph

+0

@BMpeh không cho tôi nhiều tín dụng hơn tôi đáng giá. Tôi đã học 'so sánh' với một người khác và rất vui khi biết' so sánh' từ bạn. (Để lại câu trả lời, những người đọc không hề sợ hãi trở nên bối rối vô vọng.) –

2

Ngoài ra, nếu bạn có một chức năng thay thế (ví dụ, gọi nó là f) mà từ đó để tạo thành một trật tự, bạn có thể sử dụng các thuộc tính Data.Monoid của Thứ tự:

sortBy (comparing fst `mappend` comparing (f . snd)) 

mà sẽ sử dụng chức năng của bạn trên thành phần thứ hai của cặp. Nếu bạn không cần hoặc có tiêu chí thứ hai để sắp xếp các cặp của bạn, thì sortBy (comparing fst) sẽ chỉ tốt (danh sách kết quả sẽ chỉ có các cặp có cùng thành phần đầu tiên trong thứ tự danh sách).

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