非穷举模式匹配问题

时间:2017-11-01 15:33:53

标签: pattern-matching ocaml

我制作了一个虚拟函数,它包含两个列表的列表,如下所示:

# 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([]);;时,我收到错误。当我以为我已经使用上面的代码完成它时,我只是不确定该检查这个案例的人。

1 个答案:

答案 0 :(得分:4)

match表达式中的模式是详尽无遗的,事实上它们并非详尽无遗,因为模式[]永远无法匹配表达式{ {1}}。

功能签名([a;b])中的模式并不详尽。您应该使用普通参数名称替换该模式,然后匹配该模式。所以你的看起来应该是这样的:

([a;b])

或者你可以只使用let rec test xs = match xs with ... 而不是完全命名参数:

function