Арность — количество аргументов, принимаемых функцией. То же: arity.
В Эрланге функции с разной арностью считаются совершенно разными функциями. Как правило, конечно, функции с одинаковым названием (атомом названия), но разной арностью делают похожие вещи. Если посмотреть официальную документацию по модулям Эрланга, то можно увидеть этому бесчисленные примеры. Например, есть такие две похожие функции:
term_to_binary(Term) -> ext_binary()
term_to_binary(Term, Options) -> ext_binary()
Обе они превращают произвольный терм в бинарник, но первая делает это без опций, а вторая — с опциями.
Для универсальной идентификации функции в документации пишут так:
Модуль:Функция/Арность
Примеры:
Не всегда, однако, функции с одинаковыми атомами названия ведут себя одинаково. Может быть, например, разнобой в аргументах.
spawn(Fun) -> pid()
spawn(Node, Fun) -> pid()
spawn(Module, Function, Args) -> pid()
spawn(Node, Module, Function, Args) -> pid()
Все эти функции спаунят актор. Но первые две в качестве аргумента принимают фунтерм (Fun). А следующие две — атом обычной функции (Function).
К счастью, в оболочке можно пользоваться удобными функциями h/1, h/2 и h/3 для получения справки по модулю, модулю+функции, модулю+функции+арности. Всегда можно быстро глянуть, как именно работает та или иная функция.
1> h(erlang,spawn,1).
-spec spawn(Fun) -> pid() when Fun :: function().
Returns the process identifier of a new process started by the
application of Fun to the empty list []. Otherwise works like
spawn/3.
ok
2> h(erlang,spawn,4).
-spec spawn(Node, Module, Function, Args) -> pid()
when
Node :: node(),
Module :: module(),
Function :: atom(),
Args :: [term()].
Returns the process identifier (pid) of a new process started by
the application of Module:Function to Args on Node. If
Node does not exist, a useless pid is returned. Otherwise works
like spawn/3.
ok
Кстати, если в оболочке ввести h()
(то есть без аргументов), то будет совсем уже другая функция. Она показывает историю команд в оболочке.
3> h().
1: h(erlang, spawn, 1)
-> ok
2: h(erlang, spawn, 4)
-> ok
ok
Когда для создаваемого модуля мы определяем поведение, арность функций имеет значение (как и в других случаях).
Будет варнинг, например, если в модуле определено некоторое поведение, но при этом для какой-нибудь функции не соблюдена арность.
© Алексей Карманов, 2024.