【发布时间】:2012-02-22 20:20:22
【问题描述】:
我在学习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 认为这并不详尽(我怎么会误解这个)?
- 是否存在此功能会失败的情况?
- 我这样写函数是不是在做蠢事?
【问题讨论】: