Erlang不会对未使用的函数参数发表警告

时间:2017-02-26 11:57:08

标签: erlang pattern-matching

如果我宣布一个功能

test(A) -> 3.

Erlang会生成有关未使用变量A的警告。但是定义

isEqual(X,X) -> 1.

不会发出任何警告,但

isEqual(X,X) -> 1;
isEqual(X,Y) -> 0.

再次产生警告但仅针对第二行。

1 个答案:

答案 0 :(得分:6)

这不会产生警告的原因是因为在第二种情况下,您通过使用相同的变量名称断言(通过模式匹配),isEqual/2的第一个和第二个参数具有相同的值。所以你实际上是在使用参数的值。

如果我们查看从is_equal/2生成的Core Erlang代码,可能会有所帮助。您可以通过以下方式编译.core文件来获取.erl源文件:erlc +to_core pattern.erl(请参阅此处查看pattern.erl)。

这将生成一个pattern.core文件,看起来像这样(删除了module_info/[0,1]个函数):

module 'pattern' ['is_equal'/2]
  attributes []

'is_equal'/2 = fun (_cor1,_cor0) ->
                   case <_cor1,_cor0> of
                     %% Line 5
                     <X,_cor4> when call 'erlang':'=:=' (_cor4, X) ->
                       1
                     %% Line 6
                     <X,Y> when 'true' ->
                       0
                   end

如您所见,is_equal/2源代码中.erl的每个函数子句都被转换为Core Erlang中的case子句。 X确实在第一个子句中使用,因为它需要与另一个参数进行比较。另一方面,第二个子句中不使用XY