Пользовательская isordered функция Haskell для проверки списка целых чисел - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь написать функцию на Haskell, которая проверяет, находится ли список целых чисел в порядке, без использования какой-либо из уже существующих функций для упорядочения или проверки порядка в списке.Я написал следующий код, но я не понимаю, почему он не работает.Я получаю ошибку:

No instance for (Ord integer)
      arising from a use of `<='
    In the expression: x <= (head xs)

Я не понимаю, что это значит.Есть ли другой способ, которым я должен писать эту функцию?Вот мой код.

isordered :: [integer] -> Bool
isordered [] = True
isordered (x:[]) = True
isordered (x:xs)|x <= (head xs) = isordered xs
                |otherwise = False

Заранее спасибо !!!

Ответы [ 3 ]

8 голосов
/ 01 апреля 2012

В Haskell имена типов начинаются с заглавных букв, а переменные типов начинаются со строчных букв. Так что если вы напишите integer, это переменная типа. Таким образом, ваш тип такой же, как и [a] -> Bool, то есть вы берете список чего угодно и возвращаете Bool. Таким образом, поскольку нет ограничений на то, какой тип элемента может быть в списке, вы не можете использовать <= для него.

Чтобы исправить это, вы можете либо просто изменить его на Integer, чего вы хотели, либо добавить ограничение Ord, например: Ord a => [a] -> Bool. Последнее заставит вашу функцию работать с любым типом, который реализует класс типов Ord (который предоставляет операторы сравнения, такие как <=).

3 голосов
/ 01 апреля 2012

Что именно считается «уже существующей функцией»?

isordered xs = all (uncurry (<=)) $ zip xs (tail xs)

Более низкий уровень -

isordered (x:y:zs) = x <= y && isordered (y:zs)
isordered _ = True 
0 голосов
/ 11 июня 2014

Еще один способ сделать это с помощью охранников:

isOrdered :: Ord a => [a] -> Bool
isOrdered (x:y:xs) | x<=y = isOrdered (y:xs)
                   | otherwise = False
isOrdered _ = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...