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