我制作了一个虚拟函数,它包含两个列表的列表,如下所示:
# let rec test ([a;b]) = match [a;b] with
[] -> []
| h::t ->
if ((List.length h) > 0) then
[List.hd a]
else
[]
;;
我得到了这个警告作为回报:
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
但是在上面的函数中,我是否匹配匹配函数的第一个匹配中的[]
?
警告是有道理的,因为当我执行test([]);;
时,我收到错误。当我以为我已经使用上面的代码完成它时,我只是不确定该检查这个案例的人。
答案 0 :(得分:4)
match
表达式中的模式是详尽无遗的,事实上它们并非详尽无遗,因为模式[]
永远无法匹配表达式{ {1}}。
功能签名([a;b]
)中的模式并不详尽。您应该使用普通参数名称替换该模式,然后匹配该模式。所以你的看起来应该是这样的:
([a;b])
或者你可以只使用let rec test xs = match xs with
...
而不是完全命名参数:
function