Сортировать список кортежей по вторым элементам - PullRequest
11 голосов
/ 17 февраля 2012

Я хочу отсортировать список кортежей по их вторым элементам.

Пример ввода:

[("Bob",3),("Terry",1)]

Пример вывода:

[("Terry",1)("Bob",3)]

Ответы [ 3 ]

15 голосов
/ 17 февраля 2012

Еще один крутой прием - использовать on из Data.Function:

import Data.Function (on)
import Data.List (sortBy)

sortBy (compare `on` snd) [...]

Не сильно отличается от comparing, но время от времени это хороший прием.

13 голосов
/ 17 февраля 2012

Вы можете использовать sortBy и comparing:

sortBy :: (a -> a -> Ordering) -> [a] -> [a]
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering

В этом случае мы хотим сравнить по второму элементу. Вы можете использовать comparing snd, чтобы получить функцию, которая может сравнивать два кортежа по их второму элементу.

2 голосов
/ 17 февраля 2012

Рассмотрим "обычную" сортировку

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 ...

Конечно, если вы умны, вы абстрагируете «аксессор» и сделаете его дополнительным входом для функции сортировки:

sortComparingOn f xs = ... f a < f b ...

Вы могли бы вообще абстрагировать компаратор:

sortBy cmp xs = ... a `cmp` b ...

sortBy предоставляется в Data.List, как уже упоминалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...