我刚刚开始摆弄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.


为什么这样做呢?
例如

factorCount (_N, ISqrt, Candidate, Count) when Candidate > ISqrt -> Count;
factorCount ( N, ISqrt, Candidate, Count) ->


为什么不只是其中一个函数具有内部条件?

最佳答案

原因之一是可读性和可维护性。由于附加的缩进,函数内部的条件倾向于使代码向右爬,而与主体中的附加条件相结合则使较长的函数难以阅读,推理和维护。

另一个原因是函数通常具有先决条件,并且保护措施通常可以比嵌入在函数主体中的代码更清楚地表达这些先决条件。

还有一个原因是,匹配参数的模式总是在调用函数时发生,因为从本质上讲,这就是函数参数获取其绑定的方式,因此很自然地在警卫中使用这些绑定值。保护是模式匹配的一种扩展,允许您检查仅模式匹配无法检查的内容。

10-06 09:30