Функции
Понятно что это такое, понятно для чего они используются. В erlang функции это все. Они вызываются, передаются в качестве аргументов, создаются другими функциями. Давайте определим, для примера, бесполезную функцию считающую произведение двух чисел:
mul(A, B) -> A * B.
В консоли такой синтаксис работать не будет, но можно изощрться создать через лямбда-функцию:
1> F = fun(A, B) -> A * B. 2> F(2, 3). 6
Классический пример факториала:
factorial(0) -> 1; factorial(N) -> N * factorial(N-1).
Как видите, сопоставление используется для аргументов функций, и при том очень широко:
calc({multiply, A, B}) -> A * B; calc({divide, A, B}) -> A / B.
В этом примере можно видеть, как в зависимости от значения константы в кортеже, выполняются разные типы вычислений.
Модули
Код нужно структурировать и организовывать, чтобы не потеряться в хаосе функций, для этого используются модули, — отдельные файлы содержащие своего рода «публичные» и «приватные» функции:
-module (test). -export ([calc/1]). calc({multiply, A, B}) -> A * B; calc({divide, A, B}) -> A / B.
Вначале модуля можно видеть директивы module, export. Если первый определяет имя модуля, который должен совпадать с именем файла, то второй указывает какие функции могут быть использованы снаружи модуля. Синтаксис calc/1 означает что экспортируется ф-ция с одним аргументом. Директива import означает что функции другого модуля должны быть доступны. Модули, также, должны быть скомпилированы перед использованием. Скомпилированный модуль имеет разрешение .beam. Компилируется модуль функцией c():
1> c(test.erl). {ok,test}