2010-10-06 3 views
1

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

До сих пор, что у меня есть:

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

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

перевод я придумал для секции с охранником является:

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

По существу этот вопрос сводится к тому: Как вы выразить (голова (хвост песни1)) в «х: хз "синтаксис типа?

Приветствия, -Zigu

ответ

9

Ваш рисунок почти правильно, вам просто необходимо окружить его со скобками:

myordered (y:x:xs) 

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

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

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

myordered (y:[email protected](x:_)) 
| y <= x = myordered xs 
| otherwise = False 

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

+0

Поскольку это домашнее задание, восстановление хвоста может быть легче понять: myordered (y: x: xs) | y <= x = myordered (x: xs). – yatima2975

+0

@yatima: Ну, это был первый вариант, который я дал. – sepp2k

+0

Извините! Я не читал правильно. – yatima2975

4

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

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

zipWith функция принимает два списка и применить функцию. Здесь он возвращает массив логических значений в соответствии с условием.
and принимает список булевых значений и возвращает значение ИСТИНА, если все значения в списке Правда

+4

Это прекрасное идиоматическое решение ... что новичок не напишет. Я думаю, что учитель поймал бы: -P – luqui

+2

Мне это нравится. Единственное, что я изменил, это «drop 1» вместо «tail», чтобы он работал на []. – mokus

+0

Спасибо mokus [] будет работать и с хвостом. – jijesh

0

Как насчет

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 
Смежные вопросы