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 ..]).
当您明确说明此子句何时有效时,它还会提供更清晰的代码,而不仅仅是默认情况下.是的,我知道在某些(很多)情况下,由于测试可能变得非常复杂或者您想要某种形式的默认情况,因此无法正确执行此操作.但不是在这里.
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |