2014-02-03 4 views
0

Я пытаюсь написать функцию, которая будет проверять, если ее элементы чередуются.Имеет ли список переменные элементы

Пример такого списка будет: [1,2,1,2,1,2]

Моя попытка до сих пор:

fun isAlternating(lst) = 
    case lst of 
     [] => true 
    | x::y::tail => if y <> x 
      then isAlternating(y::tail) 
      else false 

Когда я пытаюсь проверить метод, который он поднимает следующее исключение:

uncaught exception Match [nonexhaustive match failure] 

Это Кажется, мне не хватает шаблона, но я не знаю, какой из них. Может кто-то помочь мне с этим?

ответ

2

Вам не хватает списка одно элементов в совпадении шаблонов. Это должно работать. В случае элемента с одним списком вы должны указать true по определению.

fun isAlternating(lst) = 
    case lst of 
     [] => true 
     | x::nil => true 
     | x::y::tail => if y <> x 
         then isAlternating(y::tail) 
         else false; 
0

Будучи немного педантичным, обратите внимание, что в соответствии с вашим примером, а также имя вашей функции вы хотите проверить список содержит ли чередующиеся элементы (т.е. только два различные элементы, которые по очереди их появления в списке). Но это не то, что ваша функция (или @Diego Sevilla, если на то пошло) вычисляет. Вы просто проверяете, что никакие последовательные элементы в списке не совпадают. Может быть, вы действительно хотели что-то вроде этого:

fun is_alternating (x::(xs as _::y::_)) = 
     if x = y then is_alternating xs else false 
    | is_alternating _ = true; 

Обратите внимание, как порядок вопросов узоров: либо мы имеем по крайней мере 3 элемента (шаблон: x::_::y_::) или иным образом (картина: _) мы сопоставляем все остальное (то есть, пустой списки, одиночные списки и списки из двух элементов). Также обратите внимание, как использование x as pattern позволяет избежать структур, которые там уже существуют.

Что касается того, что функция делает:

  • Если есть по крайней мере 3 элемента, убедитесь, что первый и третий являются одинаковыми и рекурсивно повторить эту проверку на хвосте списка ввода.
  • В противном случае список содержит не более двух элементов и, таким образом, является чередующимся.
Смежные вопросы