2011-09-19 26 views
5

Tôi muốn sử dụng Data.List.groupBy để nhóm một danh sách các bộ dữ liệu dựa trên sự bình đẳng của phần tử snd.
tôi có thể làm điều này:Có giải pháp thư viện chuẩn nào cho vấn đề Haskell này không?

groupBy (\l r -> snd l == snd r) listOfTuples 

Nhưng nó đập vào mắt tôi như quá nhiều soạn sẵn trong chức năng và so sánh- - đặc biệt là bởi vì nó có thể nhận được rất nhiều lộn xộn hơn nếu tôi được làm một so sánh phức tạp hơn. Tôi muốn làm điều gì đó như:

groupBy (comparing snd) listOfTuples 

nhưng chữ ký loại so sánh là comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering, vì vậy nó không biên dịch trong ví dụ này.
Tôi cũng có thể làm:

groupBy (\l r -> (comparing snd l r) == EQ) listOfTuples 

Nhưng đây không phải là tốt hơn so với lần thử đầu tiên. Có giải pháp thư viện chuẩn nào cho vấn đề này không, trước khi tôi tự xoay sở?

Trả lời

15
groupBy ((==) `on` snd) listOfTuples 

Tôi nghĩ rằng đã từng có equating = on (==) trong thư viện chuẩn, mặc dù tôi không thể tìm thấy nó ngay bây giờ.

+0

Gói nào 'on' đến từ đâu? –

+3

@Matt: Data.Function (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:on) nói chung bạn có thể tìm kiếm các hàm trên hoogle: http://www.haskell.org/hoogle/?hoogle=on – porges

+0

@Porges: cảm ơn! –

-1

Đây có phải là điều bạn muốn không?

groupBy ((==EQ) . comparing snd) listOfTuples 
+0

điều này không biên dịch –

+0

Hmm, tôi luôn nghĩ vậy. là huyền diệu. Nhưng không phải vậy. Tôi nghĩ rằng có một chức năng nâng mà có thể làm một cái gì đó tương tự. 'lift :: (a-> b) -> (c-> d-> b) -> c -> d'. Hoogle cho tôi 'on' như @Daniel Wagner gợi ý. – nulvinge

+2

Bạn có thể viết nó thành 'groupBy (((= = EQ).). So sánh snd) listOfTuples'. Lưu ý thành phần hàm được áp dụng một phần. – hammar

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