首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除“这种模式匹配并非详尽无遗.”的警告?

如何消除“这种模式匹配并非详尽无遗.”的警告?
EN

Stack Overflow用户
提问于 2020-11-30 19:08:07
回答 2查看 167关注 0票数 0

我用OCaml编写了以下函数,它接受嵌套对并返回对(a,b),以便a是所有奇数元素的嵌套对,b是带有所有偶数元素的嵌套对:

代码语言:javascript
复制
let rec split_var_val xs =
  match xs with
  | Nil -> Pair(Nil,Nil)
  | Pair(Pair(x, Pair(y, Nil)), tail) ->
      let Pair(a,b) = split_var_val tail in
      Pair(Pair(x,a),Pair(y,b)) 
  | _ -> raise X_no_match ;;

该函数运行良好,但我得到了以下警告

代码语言:javascript
复制
this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(Nil|Bool _|Number _|Char _|String _|Symbol _)

如何修复函数以消除警告?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-30 19:34:19

该警告由以下表达式产生:

代码语言:javascript
复制
let Pair(a,b) = split_var_val tail in

它假设split_var_val总是返回由Pair构造函数构造的值,如果我们研究实现(模块化引发异常的全匹配情况),这是一个公平的假设。

如果你想做这个假设,你可以让编译器闭嘴,例如,

代码语言:javascript
复制
let Pair(a,b) = split_var_val tail [@@warning "-P"] in

或者你可以通过对所有情况进行匹配,使模式匹配详尽无遗,

代码语言:javascript
复制
let (a,b) = match split_var_val tail with
  | Pair (a,b) -> (a,b)
  | _ -> assert false in (* or something less generic *)

一个更好的解决方案是重新工作您的函数,并使它返回一个对,而不将其包装到对构造函数中。(基本上,用Pair包起来就像过早的向上投射一样)。

代码语言:javascript
复制
let rec split_var_val xs =
  match xs with
  | Nil -> (Nil,Nil)
  | Pair(Pair(x, Pair(y, Nil)), tail) ->
      let (a,b) = split_var_val tail in
      (Pair(x,a),Pair(y,b)) 
  | _ -> raise X_no_match 

然后,在使用split_var_val xs的其他地方,只需将其包装为let x,y = split_var_val xs in Pair (x,y)

票数 3
EN

Stack Overflow用户

发布于 2020-11-30 19:27:02

它指的是这一行:

代码语言:javascript
复制
let Pair(a,b) = split_var_val tail in
    ^^^^^^^^^

要消除警告,通常需要使用match ... with。如果您确定获得Pair以外的其他内容是错误,可以使用assert false,如下所示:

代码语言:javascript
复制
(match split_var_val tail with
 | Pair(a,b) -> ...
 | Nil -> assert false
)

assert false将引发一个异常,其中包含源代码中错误的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65079677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档