Erlang-関数

Erlangは関数型プログラミング言語として知られているため、Erlangで関数がどのように機能するかについて多くの重点が置かれることが期待されます。この章では、Erlangの関数で何ができるかについて説明します。

関数の定義

関数宣言の構文は次のとおりです-

構文

FunctionName(Pattern1… PatternN) ->
Body;

どこ、

  • FunctionName −関数名はアトムです。

  • Pattern1… PatternN−各引数はパターンです。引数の数Nは、関数のアリティです。関数は、モジュール名、関数名、およびアリティによって一意に定義されます。つまり、同じ名前で同じモジュール内にあるが、アリティが異なる2つの関数は、2つの異なる関数です。

  • Body −句の本体は、コンマ(、)で区切られた一連の式で構成されます。

次のプログラムは、関数の使用の簡単な例です-

-module(helloworld). 
-export([add/2,start/0]). 

add(X,Y) -> 
   Z = X+Y, 
   io:fwrite("~w~n",[Z]). 
   
start() -> 
   add(5,6).

上記のプログラムについては、次の点に注意してください。

  • 2つの関数を定義しています。1つは add これは2つのパラメーターを取り、もう1つは start 関数。

  • どちらの関数もエクスポート関数で定義されています。これを行わないと、関数を使用できなくなります。

  • 1つの関数を別の関数内で呼び出すことができます。ここでは、start関数からadd関数を呼び出しています。

上記のプログラムの出力は次のようになります-

出力

11

匿名関数

匿名関数は、名前が関連付けられていない関数です。Erlangには無名関数を定義する機能があります。次のプログラムは無名関数の例です。

-module(helloworld). 
-export([start/0]). 

start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().

上記の例については、以下の点に注意する必要があります。

  • 匿名関数は、 fun() キーワード。

  • 関数はFnと呼ばれる変数に割り当てられます。

  • 関数は変数名を介して呼び出されます。

上記のプログラムの出力は次のようになります-

出力

Anonymous Function

複数の引数を持つ関数

Erlang関数は0個以上のパラメーターで定義できます。関数のオーバーロードも可能です。パラメーターの数が異なる限り、同じ名前の関数を複数回定義できます。

次の例では、関数のデモは、関数定義ごとに複数の引数を使用して定義されています。

-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).

上記のプログラムでは、add関数を2回定義しています。ただし、最初のadd関数の定義には2つのパラメーターが含まれ、2番目の関数の定義には3つのパラメーターが含まれます。

上記のプログラムの出力は次のようになります-

出力

11
17

ガードシーケンスを備えた関数

アーランの関数には、ガードシーケンスを持つ機能もあります。これらは、trueと評価された場合にのみ関数を実行させる式に他なりません。

ガードシーケンスを持つ関数の構文を次のプログラムに示します。

構文

FunctionName(Pattern1… PatternN) [when GuardSeq1]->
Body;

どこ、

  • FunctionName −関数名はアトムです。

  • Pattern1… PatternN−各引数はパターンです。引数の数Nは、関数のアリティです。関数は、モジュール名、関数名、およびアリティによって一意に定義されます。つまり、同じ名前で同じモジュール内にあるが、アリティが異なる2つの関数は、2つの異なる関数です。

  • Body −句本体は、コンマ(、)で区切られた一連の式で構成されます。

  • GuardSeq1 −これは、関数が呼び出されたときに評価される式です。

次のプログラムは、ガードシーケンスを使用した関数の簡単な使用例です。

-module(helloworld). 
-export([add/1,start/0]). 

add(X) when X>3 -> 
   io:fwrite("~w~n",[X]). 

start() -> 
   add(4).

上記のプログラムの出力は次のとおりです。

出力

4

追加関数が次のように呼び出された場合 add(3)、プログラムはエラーになります。