我得到了一个"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 -> ...发布于 2011-12-15 13:15:07
守卫是when的一部分。编译器告诉您的是,它不能判断匹配是否详尽(涵盖所有可能的情况),但可能不是。编译器不能确定,因为对于任意表达式来说,穷举是无法确定的。编译器只是计算出你至少应该有一个没有保护的模式,因为当匹配是穷举时,最后一个情况下的保护将是多余的。
因为你知道你的匹配是完全的,所以编译器基本上是正确的。你的第二个守卫是多余的。你可以把它去掉,意思没有任何区别:
match z with
| y when List.length z = 0 -> ...
| y -> ...这将使编译器感到高兴。
我喜欢这个警告;多年来,它为我发现了一些逻辑错误。
如果这段代码不只是一个例子,而是你真正写的代码,那么这样写会更地道:
match z with
| [] -> ...
| head :: tail -> ...它的效率也稍微高一点,因为它不会费心计算列表的长度,然后丢弃结果。
如果你不需要解构列表,你可以让它变得更简单:
if z = [] then
...
else
...https://stackoverflow.com/questions/8515222
复制相似问题