Арность

Арность — количество аргументов, принимаемых функцией. То же: 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.