English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Erlang 関数

Erlangはよく知られた関数型プログラミング言語であり、関数がErlangでどのように動作するかについて多くの情報があります。この章では、Erlangで関数を使用してすべての操作を行う方法を紹介します。

関数の定義

関数宣言の文法は以下の通りです:

文法

FunctionName(Pattern1… PatternN) ->
Body;

ここでは、

  • FunctionName − 関数名はアトム(ユニーク)です

  • Pattern1... PatternN − 各引数はパターンです。引数の数 N は関数の引数数です。関数名はモジュール、関数名、定義された引数数でユニークです。すなわち、同じ名前で同じモジュール内に存在する二つの関数であっても、異なる引数数を持っている場合は異なる二つの関数と見なされます。

  • Body − 子句の主体は、カンマで区切られた式のシーケンスで構成されています(,)

以下のプログラムは関数を使用するシンプルな例です -

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

上記のプログラムについて以下の点に注意してください-

  • 私たちは関数を定義しました。一つはadd関数で、引数が必要です。 2 引数、もう一方の関数はstartです;

  • これらの関数はすべてexport関数で定義されています。これをしないと、関数を使用することができません;

  • 関数は他の関数の中で呼び出せるです。ここでは、start関数がadd関数を呼び出します;

上記のコードの出力結果は -

11

匿名関数

匿名関数は関数ですが、名前に関連付けられていません。Erlangには匿名関数を定義するためのツールがあります。以下のプログラムは匿名関数の例です。

-module(helloworld). 
-export([start/0]). 
start() -> 
   Fn = fun() -> 
      io:fwrite("Anonymous Function") end, 
   Fn().

上記の例について、以下の点に注意してください -

  • 匿名関数は fun() キーワードを使用して定義されます

  • この関数は名前のついた変数 Fn に割り当てられます

  • この関数は変数名で呼び出されます

上記のコードの出力結果は -

匿名関数

複数の引数を使用する関数

Erlang関数はゼロ個または複数の引数で定義できます。関数オーバーロードも可能で、同じ名前の関数を定義できますが、引数の数が異なります。以下の例では、demo関数の各関数定義は複数の引数で定義されています。

サンプルコード

-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 函数。但第一个 add 函数的定义使用两个参数,第二个 add 函数的定义使用三个参数。

上記のコードの出力結果は -

11
17

函数使用序列

在 Erlang 中函数也都有保护序列的能力。这些都不算什么它只不过是一个表达式,只有当评估(计算)为 true 时函数才运行。

使用保护序列函数的语法如下面的程序中所示。

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

ここでは、

  • FunctionName − 関数名はアトム(ユニーク)です

  • Pattern1... PatternN − 各引数はパターンです。引数の数 N は関数の引数数です。関数名はモジュール、関数名、定義された引数数でユニークです。すなわち、同じ名前で同じモジュール内に存在する二つの関数であっても、異なる引数数を持っている場合は異なる二つの関数と見なされます。

  • Body − 子句の主体は、カンマで区切られた式のシーケンスで構成されています(,)

  • GuardSeq1 − 関数が呼び出されたときに計算式を取得します。

以下のプログラムは、プロテクションシーケンスを使用する関数の簡単な例です。

サンプルコード

-module(helloworld). 
-export([add/1,start/0]). 
add(X) when X>3 -> 
   io:fwrite("~w~n",[X]). 
start() -> 
   add(4)

上記のコードの出力結果は -

4

もし add 関数が add(3),このプログラムはエラーが発生します。