Как в этом можно выполнить наиболее просто способ записать (или возможно существует что-то встроенное в haskell), функция, какой takse как список аргументов кортежей (Строка, Интервал) и Интервал x и возвращают вершину x кортежи как список согласно значению x.
Интересно, если ее возможное для записи функции, которая также берет 3 аргумента, которые являются названием (или индекс) зарегистрированных в кортеже, согласно которому должна быть сделана сортировка.
Что лучшие решения состоят в том, чтобы сделать это довольно универсальным?
take x $ sortBy (compare `on` fst) [("asd", 1), ...]
take x
берет первые x элементов из отсортированного списка. sortBy
сортирует список, указанный в качестве второго аргумента, используя функцию сортировки, заданную в качестве первого аргумента. (compare `on` fst)
сравнивает первые значения каждого кортежа.
Обратите внимание, что в этом примере сравнивается первое значение каждого кортежа для сортировки. Чтобы отсортировать по второму значению, замените fst
на snd
.
Вы видите, что функция sortBy
является очень общей, поскольку она позволяет вам определять функцию, используемую для сравнения значений. Функция принимает два аргумента и должна возвращать один из значений LT, EQ или GT. Обратите внимание, что функция compare
требует, чтобы оба аргумента были производными от Ord
. Вспомогательную функцию на
можно найти в модуле Data.Function
. Функция sortBy
находится в модуле Data.List
.
РЕДАКТИРОВАТЬ:
Вот полный рабочий пример, который сортирует список кортежей, сравнивая их первые значения, и печатает первые 2 кортежа полученного списка. Обратите внимание, что я заменил на
из приведенного выше примера на эквивалентную функцию, которая показывает внутренние функции на
.
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
РЕДАКТИРОВАТЬ:
Как указал Том Локхорст в своем комментарии, функция , сравнивающая
из модуля Data.Ord
, является более удобочитаемой заменой / ярлыком для ] при сравнении
, поэтому приведенное выше можно также записать как sortBy (comparing fst)
.