2012-12-20 2 views
1

튜플 목록의 목록 ([[(Int, Custom)]])이 있으며 정수를 서로 비교하여 외부 목록을 정렬하고 싶습니다. 이것은 정상적인 2 차원 정렬과 동일하게 동작해야합니다. 즉, 첫 번째 항목을 정렬 한 다음 두 번째 항목을 정렬해야합니다. 그러나 전체 튜플 대신 첫 번째 부분을 비교합니다.하스켈에서 술어에 대한 2 차원 목록 정렬

1 차원 목록의 경우 sortBy (comparing fst)을 사용했지만 완전히 다른 목록으로 묶어 두었습니다. 내 CustomOrd의 인스턴스가 정렬이 자동으로 작동하도록 만들면 자동으로 작동한다는 것을 알지만 실제로 주문할 수는 없습니다.

예를 들어 예상되는 결과를 얻고 싶다면 의견을 말하십시오. 미리 감사드립니다!

답변

3

어, 그것은 뇌졸중처럼 나를 때리는 바로 질문을 한 후 :

:

comparing는 주문할 결과가 아닌 주문 또는 (unorderable입니다) 정렬 부분 목록 [(Int, Custom)]을 반환하는 함수를 필요로

comparing :: Ord a => (b -> a) -> b -> b -> Ordering 
comparing = on compare 

그래서 반환해야하는 것은 주문 가능한 정수 목록입니다 (예 : map fst). 모두 :

sortBy (compare `on` map fst) 
    :: Ord a => [[(a, b)]] -> [[(a, b)]] 
+0

그래서 'on' 기능이 존재합니다! 핸디, 응? –