Erlang - Funções
Erlang é conhecido como uma linguagem de programação funcional, portanto, você esperaria ver muita ênfase em como as funções funcionam em Erlang. Este capítulo cobre tudo o que pode ser feito com as funções em Erlang.
Definindo uma função
A sintaxe de uma declaração de função é a seguinte -
Sintaxe
FunctionName(Pattern1… PatternN) ->
Body;
Onde,
FunctionName - O nome da função é um átomo.
Pattern1… PatternN- Cada argumento é um padrão. O número de argumentos N é a aridade da função. Uma função é definida exclusivamente pelo nome do módulo, nome da função e aridade. Ou seja, duas funções com o mesmo nome e no mesmo módulo, mas com aridades diferentes, são duas funções diferentes.
Body - Um corpo de cláusula consiste em uma sequência de expressões separadas por vírgula (,):
O programa a seguir é um exemplo simples do uso de funções -
Exemplo
-module(helloworld).
-export([add/2,start/0]).
add(X,Y) ->
Z = X+Y,
io:fwrite("~w~n",[Z]).
start() ->
add(5,6).
As dicas a seguir devem ser observadas sobre o programa acima -
Estamos definindo duas funções, uma é chamada add que leva 2 parâmetros e o outro é o start função.
Ambas as funções são definidas com a função de exportação. Se não fizermos isso, não poderemos usar a função.
Uma função pode ser chamada dentro de outra. Aqui, estamos chamando a função add a partir da função inicial.
O resultado do programa acima será -
Resultado
11
Funções anônimas
Uma função anônima é uma função que não possui um nome associado a ela. Erlang tem a facilidade de definir funções anônimas. O programa a seguir é um exemplo de uma função anônima.
Exemplo
-module(helloworld).
-export([start/0]).
start() ->
Fn = fun() ->
io:fwrite("Anonymous Function") end,
Fn().
Os seguintes pontos precisam ser observados sobre o exemplo acima -
A função anônima é definida com o fun() palavra-chave.
A função é atribuída a uma variável chamada Fn.
A função é chamada por meio do nome da variável.
O resultado do programa acima será -
Resultado
Anonymous Function
Funções com vários argumentos
As funções Erlang podem ser definidas com zero ou mais parâmetros. A sobrecarga de funções também é possível, em que você pode definir uma função com o mesmo nome várias vezes, desde que tenham diferentes números de parâmetros.
No exemplo a seguir, a demonstração da função é definida com vários argumentos para cada definição de função.
Exemplo
-module(helloworld).
-export([add/2,add/3,start/0]).
add(X,Y) ->
Z = X+Y,
io:fwrite("~w~n",[Z]).
add(X,Y,Z) ->
A = X+Y+Z,
io:fwrite("~w~n",[A]).
start() ->
add(5,6),
add(5,6,6).
No programa acima, estamos definindo a função add duas vezes. Mas a definição da primeira função add leva em dois parâmetros e o segundo leva em três parâmetros.
O resultado do programa acima será -
Resultado
11
17
Funções com sequências de guarda
As funções em Erlang também têm a capacidade de ter sequências de guarda. Estas nada mais são do que expressões que somente quando avaliadas como verdadeiras farão com que a função seja executada.
A sintaxe de uma função com uma sequência de guarda é mostrada no programa a seguir.
Sintaxe
FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;
Onde,
FunctionName - O nome da função é um átomo.
Pattern1… PatternN- Cada argumento é um padrão. O número de argumentos N é a aridade da função. Uma função é definida exclusivamente pelo nome do módulo, nome da função e aridade. Ou seja, duas funções com o mesmo nome e no mesmo módulo, mas com aridades diferentes, são duas funções diferentes.
Body - O corpo de uma cláusula consiste em uma sequência de expressões separadas por uma vírgula (,).
GuardSeq1 - Esta é a expressão que é avaliada quando a função é chamada.
O programa a seguir é um exemplo simples do uso de uma função com uma sequência de guarda.
Exemplo
-module(helloworld).
-export([add/1,start/0]).
add(X) when X>3 ->
io:fwrite("~w~n",[X]).
start() ->
add(4).
O resultado do programa acima é -
Resultado
4
Se a função add foi chamada como add(3), o programa resultará em um erro.