我做了一个虚拟函数,它接受两个列表的列表,如下所示:
# 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([]);;
时,我收到一个错误。我只是不确定当我认为我已经在用上面的代码做这件事时,该检查这种情况。
您在match
表达式中的模式是详尽的,事实上它们非常详尽,因为模式[]
永远无法匹配表达式[a;b]
。
不详尽的是函数签名中的模式(([a;b])
)。您应该将该模式替换为纯参数名称,然后对其进行匹配。所以你可以看起来像这样:
let rec test xs = match xs with
...
或者,您可以只使用 function
而不命名参数:
let rec test = function
...