我正在学习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
将始终适用于具有两个或更多元素的列表,并且涵盖了一个元素和零元素的情况。据我所知,这个功能按预期工作。我认为这个问题可能与使用[]
有关,但我真的不知道。
我的问题实际上是三折:
答案 0 :(得分:5)
SML会向您发出警告,因为它不知道x
至少有两个元素。它只知道x
是一个列表,它不记得x
必须与前两个模式不匹配的事实,进入第三种情况。
不,代码不会失败。
没有理由在let语句中执行模式匹配。您可以将模式放到fun
语句中,这将导致更少的代码并删除警告:
fun everyOther [] = []
| everyOther [x] = [x]
| everyOther (head::head2::tail) = head :: everyOther tail;