Сначала мы должны сделать функцию упорядочения, которая принимает два касания и возвращает либо EQ
, LT
, либо GT
(т. Е. sortGT :: (a,b) -> (a,b) -> Ordering
.). Затем мы можем присвоить эту функцию упорядочения sortBy
, и она будет сортируйте входные данные в соответствии с этим порядком.
Так как вы хотите, чтобы первые компоненты имели первый приоритет, мы проверяем это первым и, если они равны, мы проверяем второй аргумент, если первые компоненты не равны, мы присваиваем ему значение, противоположное первоначальному упорядочению, так что упорядочено по убыванию.
Это то, что я считаю наиболее простым для глаз:
sortGT (a1,b1) (a2,b2) =
case compare a1 a2 of
EQ -> compare b1 b2
LT -> GT
GT -> LT
Теперь мы используем sortBy, как вы предложили:
*Main> sortBy sortGT [(1, "b"), (1, "a"), (2, "b"), (2, "a")]
[(2,"a"),(2,"b"),(1,"a"),(1,"b")]