ОК, сначала определите функцию:
printEven(I,N) when I >= N -> ok;
printEven(I,N) ->
if
I rem 2 == 0 -> io:format("~p~n",[I]), printEven(I+1,N);
I rem 2 == 1 -> printEven(I+1,N)
end.
Erlang - это функциональный язык программирования, и (по определению) функции «имеют» значение, поэтому вы получите «что-то» обратно. По соглашению, после завершения функции, которую вы используете для побочных эффектов, вы получаете атом «ок», который лучше всего использовать здесь.
Вы можете «молча отказаться» от возвращаемого значения, если хотите. Вы делаете это, когда вызываете функцию путем сопоставления с шаблоном переменной «позаботиться» (которая подчеркивается):
_ = printEven(3,9),
или путем вызова функции без сопоставления с образцом:
printEven(3,9),
Тем не менее, гораздо лучше всегда проверять возвращаемые значения путем сопоставления с образцом при вызове функции:
ok = printEven(3,9),
Это действительно хорошая привычка, потому что вы будете использовать множество библиотечных функций, которые возвращают коды ошибок, как вы можете видеть из их спецификаций:
@spec funky(X) -> [ok | {error, bad_op} | {error, wig_out}]
Если у funky есть побочные эффекты, вы хотите знать, что он потерпел неудачу сейчас , вызвав его с сопоставлением с шаблоном, чтобы он потерпел крах здесь и сейчас, если funky завершится неудачей:
ok = funky(99),
Если вы сопоставите его с '_'
или проигнорируете возвращаемое значение, оно вылетит через 268 строк, когда ваш моджо ожидает, что фанки выполнил его, и тогда это будет много труднее найти.
Это счастливое программирование пути, которое сделано в Erlang. «Пусть разбится» - это девиз. Если вы новичок в Erlang, вы обнаружите, что это очень смущает - как ходить по голому. Не волнуйтесь, обнимите это, это хорошо. Это приводит к тому, что много кода «не пишется».
(Вы должны также привыкнуть помещать предложение, заканчивающее рекурсию, в верхнее предложение, как показано здесь - это делает чтение кода sooo намного проще, когда у вас есть функция с несколькими предложениями.)