我用OCaml编写了以下函数,它接受嵌套对并返回对(a,b),以便a是所有奇数元素的嵌套对,b是带有所有偶数元素的嵌套对:
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 _)如何修复函数以消除警告?
发布于 2020-11-30 19:34:19
该警告由以下表达式产生:
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包起来就像过早的向上投射一样)。
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)
发布于 2020-11-30 19:27:02
它指的是这一行:
let Pair(a,b) = split_var_val tail in
^^^^^^^^^要消除警告,通常需要使用match ... with。如果您确定获得Pair以外的其他内容是错误,可以使用assert false,如下所示:
(match split_var_val tail with
| Pair(a,b) -> ...
| Nil -> assert false
)assert false将引发一个异常,其中包含源代码中错误的位置。
https://stackoverflow.com/questions/65079677
复制相似问题