Я изучаю 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
всегда будет работать для списков с двумя или более элементами, а случай с одним элементом и нулевыми элементами рассматривается. Насколько я могу судить, эта функция работает как положено. Я думаю, что проблема может быть связана с использованием []
, но я действительно не знаю.
Мой вопрос на самом деле трехкратный:
- Почему sml считает, что это не является исчерпывающим (как я это неправильно понимаю)?
- Есть ли случаи, когда эта функция не будет работать?
- Я делаю что-то тупое, написав функцию таким образом?