coding-style - Ocaml:糟糕的风格,此模式匹配中的所有子句都受到保护

标签 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 -> ...

最佳答案

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

由于您知道您的匹配是详尽无遗的,因此编译器基本上是正确的。你的第二个守卫是多余的。你可以把它关掉,意思没有区别:

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

这将使编译器高兴。

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

如果这段代码不仅仅是一个例子,而是你真正写的,那么像这样写会更惯用:
match z with
| [] -> ...
| head :: tail -> ...

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

如果你不需要解构列表,你可以让它更简单:
if z = [] then
    ...
else
    ...

关于coding-style - Ocaml:糟糕的风格,此模式匹配中的所有子句都受到保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8515222/

相关文章:

c++ - 我应该为永远恒定的值创建一个全局常量变量,例如足球运动员的数量吗?

操作大型数据类的多个 "worker classes"的 C++ 模式

java - 多重继承之类的?

syntax - "Variable ... must occur on both sides of this | pattern"

functional-programming - 在 OCaml 中,如何将 "pointers"存储到列表的元素中?

mysql - 在 PLSQL 中查找优化的查询

python - 在局部变量上使用python中的显式del

c# - IDataErrorInfo 和对象的属性验证

ocaml - 在 Ocaml 中生成 C 代码

eclipse-plugin - IDE 中的可视化文档