#sorting #haskell #computer-science
Вопрос:
Я пытаюсь проверить, отсортирован ли список в Хаскелле по возрастанию или по убыванию. Я понимаю, что сейчас понимание списка лучше всего в Хаскелле.
В настоящее время у меня есть…
ascending l = [ x > (head(tail l))| x <- l]
и
descending l = [ x < (head (tail l))| x <- l]
но это всего лишь сравнение каждого элемента в их списке с одним значением и возврат значения true и false независимо от того, больше оно или меньше, и это не то, что я ищу. Я хочу, чтобы он сказал мне, верен ли список, увеличивается он или уменьшается.
Комментарии:
1. Понимание списка-неподходящий инструмент для этой работы.
2. Я склонен согласиться с п. 1.8e9-где-моя-доля. что это лучше решается с помощью прямой рекурсии, чем с помощью понимания, но на самом деле это можно сделать довольно хорошо, если использовать понимание списка
tails
.
Ответ №1:
Независимо от того , отсортирован ли список, значение a Bool
, а понимание списка всегда возвращает списки, так что это невозможно без понимания списка, но вы можете сделать это с помощью одной внешней функции, например:
ascending l = and [x <= y | (x, y) <- zip l (tail l)]
descending l = and [x >= y | (x, y) <- zip l (tail l)]
Или вот так:
import Data.List
ascending l = and [x <= y | x:y:_ <- tails l]
descending l = and [x >= y | x:y:_ <- tails l]
Но, как сказал п. 1. 8e9-где моя доля м. в комментарии, это действительно неподходящий инструмент для работы, поэтому на самом деле вам не следует делать это таким образом на производстве.
Комментарии:
1. похоже, им нужна одна функция, которая возвращает значение true, независимо от того, идет ли список по возрастанию или по убыванию.