сортировка по Haskell - PullRequest
       12

сортировка по Haskell

9 голосов
/ 07 мая 2010

Как это можно сделать самым простым способом - написать (или, может быть, что-то встроено в haskell) функцию, которая принимает список аргументов кортежей (String, Int) и Int x и возвращает топ-х кортежей в виде списка согласно xзначение.

Интересно, возможно ли написать функцию, которая также принимает 3 аргумента, который является именем (или индексом) файла в кортеже, в соответствии с которым должна выполняться сортировка.

Каковы лучшие решения, чтобы сделать его достаточно универсальным?

1 Ответ

24 голосов
/ 07 мая 2010
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).

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