Функция Erlang, уже определенная с предложениями охраны

Написав рекурсивную функцию, я хочу, чтобы один 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, но эти два должны быть разными.

Ответ 1

Проблема состоит в том, что классы функции должны быть разделены точкой с запятой, а не периодом.

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

transfer(_Master, []) ->
    nil.

Когда вы используете период для завершения предложения, компилятор считает, что определение функции будет полным, поэтому он видит ваш код как две отдельные функции вместо разных предложений одной и той же функции.

Подробнее см. ссылку Erlang для Синтаксис объявления функций.

Ответ 2

Вам нужно использовать точку с запятой вместо двоеточия, чтобы разделить два предложения функций.