Ocaml:错误的样式,这种模式匹配中的所有子句都受到保护

时间:2011-12-15 04:46:01

标签: coding-style design-patterns ocaml matching

我得到"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 -> ...

1 个答案:

答案 0 :(得分:17)

守卫是when部分。编译器告诉你的是它无法判断你的匹配是否详尽(包括所有可能的情况),但它可能不是。编译器无法确定,因为穷举对任意表达式都是不可判定的。编译器只是认为你应该至少有一个没有后卫的模式,因为当匹配是穷举时,最后一个案例的后卫将是多余的。

由于您知道您的匹配是详尽无遗的,因此编译器基本上是正确的。你的第二个后卫是多余的。你可以放下它,意义不一致:

match z with
| y when List.length z = 0 -> ...
| y -> ...

这将使编译器满意。

我喜欢这个警告;多年来,我发现了一些逻辑错误。

如果这段代码不仅仅是一个例子,而且实际上就是你所写的,那么写这样的代码会更加惯用:

match z with
| [] -> ...
| head :: tail -> ...

它也更有效率,因为它不会费心计算列表的长度然后丢弃结果。

如果您不需要对列表进行解构,您可以使其更简单:

if z = [] then
    ...
else
    ...