如何摆脱警告“此模式匹配并不详尽...”?

迪恩·塔勒(Dean Taler)

我在Ocaml中编写了以下函数,该函数获取嵌套Pair和并返回Pair(a,b),以便a是所有奇数元素的嵌套Pair,b是所有偶数元素的嵌套Pair:

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 ;;

该功能运行良好,但出现以下警告

this pattern-matching is not exhaustive.
Here is an example of a case that is not matched:
(Nil|Bool _|Number _|Char _|String _|Symbol _)

如何修复该功能以消除警告?

静脉血

警告由以下表达式产生:

let Pair(a,b) = split_var_val tail in

它假定split_var_val始终返回使用构造函数构造的值Pair,这是一个合理的假设,如果我们研究实现方法(对引发异常的全匹配情况进行模运算)。

如果您要进行此假设,则可以告诉编译器安静,例如,

let Pair(a,b) = split_var_val tail [@@warning "-P"] in

或者您实际上可以通过匹配所有情况来使模式匹配详尽无遗,

let (a,b) = match split_var_val tail with
  | Pair (a,b) -> (a,b)
  | _ -> assert false in (* or something less generic *)

更好的解决方案是重新处理函数,并使其返回一个对,而不将其包装到Pair构造函数中。(基本上,将其包裹起来与Pair过早上传相同),例如

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OCaml-警告8:此模式匹配并不详尽

来自分类Dev

Scala警告匹配可能并不详尽

来自分类Dev

奇怪的“匹配可能并不详尽”的警告

来自分类Dev

Scala模式匹配在嵌套案例类上并不详尽

来自分类Dev

如何修复模式匹配的详尽警告?

来自分类Dev

警告:比赛不详尽

来自分类Dev

SML:错误:匹配冗余和警告:匹配不详尽

来自分类Dev

为什么绑定不详尽?

来自分类Dev

Mavericks上的Xcode 5.0.1:如何摆脱此警告?

来自分类Dev

模式匹配的选择器详尽无遗

来自分类Dev

模式匹配的选择器详尽无遗

来自分类Dev

模式匹配不是详尽无遗的,即使我指定了模式

来自分类Dev

如何修复“功能中的非详尽模式”

来自分类Dev

Haskell模式匹配警告

来自分类Dev

Haskell模式匹配警告

来自分类Dev

Qt5:如何摆脱此Singleton的编译器警告?

来自分类Dev

如何摆脱BeautifulSoup用户警告?

来自分类Dev

我如何摆脱这个警告

来自分类Dev

如何摆脱lmer警告信息?

来自分类Dev

如何摆脱特定的 gfortran 警告?

来自分类Dev

如何使用正则表达式匹配此模式

来自分类Dev

如何修复haskell中的“函数中的非详尽模式”错误?

来自分类Dev

哈斯克尔模式匹配 - 非详尽模式 - 但为什么呢?

来自分类Dev

Haskell警告:模式匹配是多余的

来自分类Dev

如何摆脱此表格标题的顶部边框?

来自分类Dev

如何摆脱此监视器错误?

来自分类Dev

安装R后如何摆脱警告消息?

来自分类Dev

如何摆脱“不兼容的指针类型”警告?

来自分类Dev

如何摆脱“更新为推荐设置”警告?