我刚刚开始摆弄 Erlang。我见过很多在函数声明中使用模式匹配的例子,如下所示:
factorCount (N) ->
Sqrt = math:sqrt (N),
ISqrt = trunc(Sqrt),
if ISqrt == Sqrt -> factorCount (N, ISqrt, 1, -1);
true -> factorCount (N, ISqrt, 1, 0)
end.
factorCount (_N, ISqrt, Candidate, Count) when Candidate > ISqrt -> Count;
factorCount ( N, ISqrt, Candidate, Count) ->
case N rem Candidate of
0 -> factorCount (N, ISqrt, Candidate + 1, Count + 2);
_ -> factorCount (N, ISqrt, Candidate + 1, Count)
end.
Run Code Online (Sandbox Code Playgroud)
为什么要这样做?。例如
factorCount (_N, ISqrt, Candidate, Count) when Candidate > ISqrt -> Count;
factorCount ( N, ISqrt, Candidate, Count) ->
Run Code Online (Sandbox Code Playgroud)
为什么这不仅仅是一个内部有内部条件的函数?
原因之一是可读性和可维护性。由于额外的缩进,函数内部的条件倾向于使代码向右蠕变,并且与主体中的额外条件相结合,使函数变得更难阅读、推理和维护。
另一个原因是函数通常有先决条件,与嵌入在函数体内的代码相比,守卫通常可以帮助更清楚地表达这些先决条件。
还有一个原因是当函数被调用时总是会发生模式匹配参数,因为这本质上是函数参数获得它们的绑定的方式,所以在守卫中使用这些绑定值是很自然的。Guards 是模式匹配的一种扩展,允许您检查仅靠模式匹配无法检查的内容。