我正在学习 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 认为这并不详尽(我是如何误解这一点的)?
- 这个功能有没有会失败的情况呢?
- 我这样写函数是不是在做一些愚蠢的事情?
SML 给你这个警告是因为它不知道这一点x
至少有两个元素。它所知道的是x
是一个列表,它不记得这样的事实x
必须不匹配前两种模式,才能进入第三种情况。
不,代码不能失败。
-
没有理由在let语句中执行模式匹配。您只需将图案放入fun
语句,这将减少代码并删除警告:
fun everyOther [] = []
| everyOther [x] = [x]
| everyOther (head::head2::tail) = head :: everyOther tail;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)