Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coding style Ocaml:糟糕的样式,此模式匹配中的所有子句都受到保护_Coding Style_Design Patterns_Ocaml_Matching - Fatal编程技术网

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语句)