Как проверить, отсортирован ли список в Haskell с помощью понимания списка?

#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, независимо от того, идет ли список по возрастанию или по убыванию.