非详尽的模式匹配问题



我做了一个虚拟函数,它接受两个列表的列表,如下所示:

# 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
  ...

最新更新