我在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] 删除。
我来说两句