Erlang函数已经使用guard子句定义

时间:2012-10-10 17:26:24

标签: erlang

编写一个递归函数,我想要一个fn,当列表有元素时执行,另一个fn在它是空的时候执行:

 transfer(Master, [H|Tail]) ->
  Master ! {transfer, H},
  transfer(Master, Tail).

transfer(_Master, []) ->
  nil.

我得到的问题是src/redis/redis_worker.erl:13: function transfer/2 already defined。我理解它对两个具有相同名称和arity的函数感到不安,但这两个函数应该是不同的。

2 个答案:

答案 0 :(得分:25)

问题是函数的子句需要用分号而不是句号分隔。

transfer(Master, [H|Tail]) ->
    Master ! {transfer, H},
    transfer(Master, Tail); % use semicolon here, not period

transfer(_Master, []) ->
    nil.

当你使用句点终止子句时,编译器会认为函数的定义是完整的,因此它将你的代码视为两个独立的函数,而不是相同函数的不同子句。

有关详细信息,请参阅Function Declaration Syntax的Erlang参考。

答案 1 :(得分:4)

您需要使用分号而不是冒号来分隔两个函数子句。