Haskell Вопрос по сопоставлению с образцом - PullRequest
1 голос
/ 06 октября 2010

Я пытаюсь написать функцию, которая принимает список и возвращает true, если он в отсортированном порядке, и false, если нет:

Пока что у меня есть:

myordered [] = True
myordered [x] = True
myordered list1
 | (head list1) <= (head (tail list1)) = myordered(tail list1)
 | otherwise                           = False

Исходя из нашего назначения, все операции «голова» и «хвост» должны быть записаны как синтаксис типа «x: xs».

перевод, который я придумаю для раздела с защитой:*

По сути, этот вопрос сводится к следующему: как выразить (head (tail list1)) в синтаксисе типа "x: xs"?

Cheers, -Zigu

Ответы [ 3 ]

9 голосов
/ 06 октября 2010

Ваш шаблон почти правильный, вам просто нужно заключить его в скобки:

myordered (y:x:xs)

Также обратите внимание, что нет необходимости заключать y и x в круглые скобки в y <= x.

Также в вашей второй версии есть семантическая ошибка:

myordered(xs) здесь xs относится к хвосту хвоста, но вы хотите весь хвост, поэтому вы должны сделать myordered (x:xs) или альтернативно:

myordered (y:xs@(x:_))
 | y <= x = myordered xs
 | otherwise  = False

Что говорит: xs - это хвост этого списка, x - это голова этого хвоста, а _ (который игнорируется) - это хвост этого хвоста.

4 голосов
/ 06 октября 2010

Как насчет другого способа сделать это с помощью функции zipWith, доступной в функции Data.List

 myordered xs= and $ zipWith (<=) xs (tail xs)

zipWith, взять два списка и применить функцию.Здесь он вернет массив логических значений в соответствии с условием.
and принимает список логических значений и возвращает значение True, только если все значения в списке имеют значение True

.
0 голосов
/ 06 октября 2010

Как насчет

isordered :: [Int] →  Bool
isordered [] = True
isordered xs = foldl (&&) True $ zipWith (<=) xs $ tail xs

О, и просто для развлечения:

isordered :: [Int] →  Bool
isordered [] = True
isordered (x:xs) = (foldl comp (Just x) xs) /= Nothing
   where comp (Just a) b = if a ≤ b then Just b else Nothing
         comp Nothing _ = Nothing  
...