Coding style Ocaml:糟糕的样式,此模式匹配中的所有子句都受到保护
我得到一个Coding style Ocaml:糟糕的样式,此模式匹配中的所有子句都受到保护,coding-style,design-patterns,ocaml,matching,Coding Style,Design Patterns,Ocaml,Matching,我得到一个“错误:警告25:错误样式,此模式匹配中的所有子句都受到保护” “守卫”是什么意思 我的代码有模式匹配- match z with | y when List.length z = 0 -> ... | y when List.length z > 0 -> ... 当零件时,防护装置为。编译器告诉您的是,它无法判断您的匹配是否是详尽的(涵盖所有可能的情况),但可能不是。编译器不能确定,因为对于任意表达式,穷举性是不可判定的。编译器只是认为您应该至少
“错误:警告25:错误样式,此模式匹配中的所有子句都受到保护”
“守卫”是什么意思
我的代码有模式匹配-
match z with
| y when List.length z = 0 -> ...
| y when List.length z > 0 -> ...
当零件时,防护装置为
。编译器告诉您的是,它无法判断您的匹配是否是详尽的(涵盖所有可能的情况),但可能不是。编译器不能确定,因为对于任意表达式,穷举性是不可判定的。编译器只是认为您应该至少有一个没有保护的模式,因为当匹配是详尽的时,最后一个案例中的保护将是多余的
因为您知道匹配是详尽的,所以编译器基本上是正确的。你的第二个守卫是多余的。你可以不带任何意义地将其删除:
match z with
| y when List.length z = 0 -> ...
| y -> ...
这将使编译器感到高兴
我喜欢这个警告;多年来,它为我发现了一些逻辑错误
如果这段代码不仅仅是一个示例,而是您真正编写的代码,那么按照以下方式编写会更加惯用:
match z with
| [] -> ...
| head :: tail -> ...
它的效率也稍微高一点,因为它不需要计算列表的长度,然后丢弃结果
如果不需要对列表进行分解,可以使其更简单:
if z = [] then
...
else
...
谢谢杰弗里。你们真的把事情弄清楚了,并帮助我学习如何编写更干净的代码(尤其是使用if语句)