Этот шаблон кажется исчерпывающим, но я все равно получаю предупреждения

Я изучаю sml и написал следующую простую функцию:

(* Return a list with every other element of the input list *)
fun everyOther [] = []
  | everyOther [x] = [x]
  | everyOther x = let
        val head::head2::tail = x
    in
        head::everyOther(tail)
    end;

Которая выдает следующее предупреждение:

! Toplevel input:
!   val head::head2::tail = x
!       ^^^^^^^^^^^^^^^^^
! Warning: pattern matching is not exhaustive

Я считаю, что функция не может не работать, так как val head::head2::tail всегда будет работать для списков с двумя или более элементами, а случай одного элемента и нулевых элементов покрыт. Насколько я могу судить, эта функция работает так, как ожидалось. Я думаю, что проблема может быть связана с использованием [] но я действительно не знаю.

На самом деле мой вопрос состоит из трех частей:

  1. Почему sml считает, что эта функция не является исчерпывающей (как я это неправильно понимаю)?
  2. Есть ли случай, когда эта функция не сработает?
  3. Не делаю ли я что-то глупое, записывая функцию таким образом?
6
задан Wilduck 31 January 2012 в 03:36
поделиться