sortBy :: (a -> a -> Ordering) -> [a] -> [a]
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering
В этом случае мы хотим сравнить второй элемент. Вы можете использовать comparing snd для получения функции, которая может сравнивать два кортежа со своим вторым элементом.
Ответ 3
Рассмотрим "регулярный" вид
sort xs = ... a < b ...
Такие типы должны использовать compare или его друзей, например <. Поэтому, если вы уже реализовали такую вещь, вместо вместо compare a b или a < b вы можете сделать compare (snd a) (snd b) или snd a < snd b.
sort xs = ... snd a < snd b ...
Конечно, если вы умны, вы абстрагируете "accessor" и делаете его дополнительным входом в функцию сортировки:
sortComparingOn f xs = ... f a < f b ...
Вы даже можете полностью исключить компаратор:
sortBy cmp xs = ... a `cmp` b ...
sortBy предоставляется в Data.List, как указано выше.