take x $ sortBy (compare `on` fst) [("asd", 1), ...]
take x
берет первые x элементов из отсортированного списка. sortBy
сортирует список, указанный как второй аргумент, используя функцию сортировки, указанную в качестве первого аргумента. (compare `on` fst)
сравнивает первые значения каждого кортежа.
Обратите внимание, что этот пример сравнивает первое значение каждого кортежа для сортировки. Чтобы отсортировать по второму значению, замените fst
на snd
.
Вы видите, что функция sortBy
является очень общей, поскольку она позволяет вам определить функцию, используемую для сравнения значений. Функция принимает два аргумента и должна возвращать один из LT, EQ или GT. Обратите внимание, что функция compare
требует, чтобы оба аргумента были производными от Ord
. Вспомогательная функция on
находится в модуле Data.Function
. Функция sortBy
находится в модуле Data.List
.
EDIT:
Вот полный рабочий пример, который сортирует список кортежей, сравнивая их первые значения и печатая первые 2 кортежа в результирующем списке. Обратите внимание, что я заменил on
из приведенного выше примера на эквивалентную функцию, которая показывает, что on
делает внутри.
import Data.Function
import Data.List
main = print $ mySort [("foo", 1), ("bar", 2), ("baz", 3), ("quux", 4)] 2
mySort list x = take x $ sortBy (\ x y -> compare (fst x) (fst y)) list
EDIT:
Как отметил в своем комментарии Том Локхорст, функция comparing
из модуля Data.Ord
является более читаемой заменой / ярлыком для on compare
, поэтому вышеприведенное также можно записать как sortBy (comparing fst)
.