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