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

Jan*_*ard 7 erlang pattern-matching guard

"Erlang编程"中有这个索引函数:

index(0, [X|_]) -> X;
index(N, [_|Xs]) when N>0 -> index(N-1, Xs)
Run Code Online (Sandbox Code Playgroud)

由于模式匹配,不是"当N> 0"时多余的守卫吗?调用索引(0,List)永远不会在第二个子句中结束,所以N总是> 0.或者我在这里完全错了?

sdc*_*vvc 12

该函数适用于N> = 0.没有守卫,对于N <0,它将遍历整个列表:

index(-2,[1,2,3]) - > index(-3,[2,3]) - > ... - > index(-5,[]) - >错误.

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


can*_*tes 6

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


rvi*_*ing 5

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