Erlang - Funkcje
Erlang jest znany jako funkcjonalny język programowania, dlatego można się spodziewać, że duży nacisk zostanie położony na sposób działania funkcji w Erlang. W tym rozdziale opisano, co można zrobić za pomocą funkcji programu Erlang.
Definiowanie funkcji
Składnia deklaracji funkcji jest następująca -
Składnia
FunctionName(Pattern1… PatternN) ->
Body;
Gdzie,
FunctionName - Nazwą funkcji jest atom.
Pattern1… PatternN- Każdy argument jest wzorem. Liczba argumentów N jest liczbą argumentów funkcji. Funkcja jest jednoznacznie definiowana przez nazwę modułu, nazwę funkcji i stopień. Oznacza to, że dwie funkcje o tej samej nazwie i w tym samym module, ale o różnych właściwościach, to dwie różne funkcje.
Body - Treść klauzuli składa się z sekwencji wyrażeń oddzielonych przecinkiem (,):
Poniższy program jest prostym przykładem użycia funkcji -
Przykład
-module(helloworld). 
-export([add/2,start/0]). 
add(X,Y) -> 
   Z = X+Y, 
   io:fwrite("~w~n",[Z]). 
   
start() -> 
   add(5,6).
Na temat powyższego programu należy zwrócić uwagę na następujące wskazówki -
Definiujemy dwie funkcje, jedną nazywa się add który przyjmuje 2 parametry, a drugi to start funkcjonować.
Obie funkcje są definiowane za pomocą funkcji eksportu. Jeśli tego nie zrobimy, nie będziemy mogli korzystać z tej funkcji.
Jedną funkcję można wywołać wewnątrz innej. Tutaj wywołujemy funkcję add z funkcji start.
Wynik powyższego programu będzie -
Wynik
11
Funkcje anonimowe
Funkcja anonimowa to funkcja, z którą nie jest skojarzona żadna nazwa. Erlang ma możliwość definiowania funkcji anonimowych. Poniższy program jest przykładem funkcji anonimowej.
Przykład
-module(helloworld). 
-export([start/0]). 
start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().
Na powyższy przykład należy zwrócić uwagę na następujące punkty:
Funkcja anonimowa jest definiowana za pomocą fun() słowo kluczowe.
Funkcja jest przypisana do zmiennej o nazwie Fn.
Funkcja jest wywoływana poprzez nazwę zmiennej.
Wynik powyższego programu będzie -
Wynik
Anonymous Function
Funkcje z wieloma argumentami
Funkcje Erlanga można zdefiniować z zerem lub większą liczbą parametrów. Możliwe jest również przeciążanie funkcji, w którym można wielokrotnie zdefiniować funkcję o tej samej nazwie, o ile mają one różną liczbę parametrów.
W poniższym przykładzie demo funkcji jest zdefiniowane z wieloma argumentami dla każdej definicji funkcji.
Przykład
-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).
W powyższym programie dwukrotnie definiujemy funkcję add. Ale definicja pierwszej funkcji add przyjmuje dwa parametry, a druga przyjmuje trzy parametry.
Wynik powyższego programu będzie -
Wynik
11
17
Funkcje z sekwencjami ochronnymi
Funkcje w Erlangu mają również możliwość posiadania sekwencji ochronnych. To nic innego jak wyrażenia, które tylko wtedy, gdy zostaną ocenione jako prawda, spowodują uruchomienie funkcji.
Poniższy program przedstawia składnię funkcji z sekwencją ochronną.
Składnia
FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;
Gdzie,
FunctionName - Nazwą funkcji jest atom.
Pattern1… PatternN- Każdy argument jest wzorem. Liczba argumentów N jest liczbą argumentów funkcji. Funkcja jest jednoznacznie definiowana przez nazwę modułu, nazwę funkcji i stopień. Oznacza to, że dwie funkcje o tej samej nazwie i w tym samym module, ale o różnych właściwościach, to dwie różne funkcje.
Body - Treść klauzuli składa się z sekwencji wyrażeń oddzielonych przecinkiem (,).
GuardSeq1 - To jest wyrażenie, które jest obliczane, gdy wywoływana jest funkcja.
Poniższy program jest prostym przykładem użycia funkcji z sekwencją ochronną.
Przykład
-module(helloworld). 
-export([add/1,start/0]). 
add(X) when X>3 -> 
   io:fwrite("~w~n",[X]). 
start() -> 
   add(4).
Wynik powyższego programu to -
Wynik
4
Jeśli funkcja add została wywołana jako add(3)program spowoduje błąd.