首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ocaml:风格不佳,此模式匹配中的所有子句都受到保护

Ocaml:风格不佳,此模式匹配中的所有子句都受到保护
EN

Stack Overflow用户
提问于 2011-12-15 12:46:01
回答 1查看 3.3K关注 0票数 7

我得到了一个"Error: Warning 25: bad style, all clauses in this pattern-matching are guarded"

“守卫”是什么意思?

我的代码有模式匹配-

代码语言:javascript
复制
match z with
    | y when List.length z = 0 -> ...
    | y when List.length z > 0 -> ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-15 13:15:07

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

因为你知道你的匹配是完全的,所以编译器基本上是正确的。你的第二个守卫是多余的。你可以把它去掉,意思没有任何区别:

代码语言:javascript
复制
match z with
| y when List.length z = 0 -> ...
| y -> ...

这将使编译器感到高兴。

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

如果这段代码不只是一个例子,而是你真正写的代码,那么这样写会更地道:

代码语言:javascript
复制
match z with
| [] -> ...
| head :: tail -> ...

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

如果你不需要解构列表,你可以让它变得更简单:

代码语言:javascript
复制
if z = [] then
    ...
else
    ...
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8515222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档