我得到"Error: Warning 25: bad style, all clauses in this pattern-matching are guarded"
“守卫”是什么意思?
我的代码有模式匹配 -
match z with
| y when List.length z = 0 -> ...
| y when List.length z > 0 -> ...
答案 0 :(得分:17)
守卫是when
部分。编译器告诉你的是它无法判断你的匹配是否详尽(包括所有可能的情况),但它可能不是。编译器无法确定,因为穷举对任意表达式都是不可判定的。编译器只是认为你应该至少有一个没有后卫的模式,因为当匹配是穷举时,最后一个案例的后卫将是多余的。
由于您知道您的匹配是详尽无遗的,因此编译器基本上是正确的。你的第二个后卫是多余的。你可以放下它,意义不一致:
match z with
| y when List.length z = 0 -> ...
| y -> ...
这将使编译器满意。
我喜欢这个警告;多年来,我发现了一些逻辑错误。
如果这段代码不仅仅是一个例子,而且实际上就是你所写的,那么写这样的代码会更加惯用:
match z with
| [] -> ...
| head :: tail -> ...
它也更有效率,因为它不会费心计算列表的长度然后丢弃结果。
如果您不需要对列表进行解构,您可以使其更简单:
if z = [] then
...
else
...