为什么在这个功能中使用“何时”?

时间:2010-08-08 14:55:13

标签: erlang pattern-matching guard

“Erlang Programming”中有这个索引函数:

index(0, [X|_]) -> X;
index(N, [_|Xs]) when N>0 -> index(N-1, Xs)

由于模式匹配,“N> 0”时保护不是多余的吗?调用索引(0,List)永远不会在第二个子句中结束,因此N将始终为> 0.或者我在这里完全错了?

3 个答案:

答案 0 :(得分:12)

该功能适用​​于N&gt; = 0。没有守卫,对于N <0,它将遍历整个列表:

指数(-2,[1,2,3]) - &gt; index(-3,[2,3]) - &gt; ... - &gt; index(-5,[]) - &gt;错误。

这不是一个大问题,只有你可能会遇到一个令人困惑的例外。在具有无限列表的语言(Haskell,Ocaml)中,忘记该保护可能会导致无限循环:index(-1,[0,0,0 ..])。

答案 1 :(得分:6)

when子句防止负面索引(编辑:见原始问题的评论;)。

答案 2 :(得分:5)

当您明确说明此子句何时有效时,它也会提供更清晰的代码,而不仅仅是默认情况下。是的,我知道在某些(很多)情况下,由于测试可能变得非常复杂或者您想要某种形式的默认情况,因此无法正确执行此操作。但不是在这里。