сортировка haskell

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

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

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

9
задан Chris Martin 27 February 2016 в 02:25
поделиться

1 ответ

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

24
ответ дан 4 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: