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

Erlang Fun

FunはErlangで匿名関数を定義するために使用されます。匿名関数の一般的な文法は以下の通りです:

文法

F = fun (Arg1, Arg2, ... ArgN) ->
   ...
終了

説明

  • F −これは匿名関数に割り当てられる変数名です。

  • Arg1, Arg2, ... ArgN −これらは匿名関数に渡される引数です。

以下の例では、匿名関数の使用方法を示します。

インスタンス

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

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

  • 匿名関数は変数Aに割り当てられます。

  • 変数を通じて匿名関数A()

上記のプログラムを実行すると、以下のような結果が得られます。

「Hello」

匿名関数の別の例ですが、これは引数を使用しています。

-> module(helloworld). 
-> export([start/> 0]). 
start() -> 
   A = fun(X) -> 
      io:fwrite("~p~n",[X]) 
      end, 
   A(5)

上記のプログラムを実行すると、以下のような結果が得られます。

出力

5

変数の使用

匿名関数は匿名関数の範囲外の変数にアクセスする能力を持っています。一例を見てみましょう。-

インスタンス

-> module(helloworld). 
-> export([start/> 0]). 
start() -> 
   B = 6, 
   A = fun(X) -> 
      io:fwrite("~p~n",[X]), 
      io:fwrite("~p~n",[B]) 
      end, 
   A(5)

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

  • 変数Bは、アニミング関数の範囲外にあります。

  • アニミング関数は、グローバル範囲で定義された変数にアクセスできます。

上記のプログラムを実行すると、以下のような結果が得られます。

出力

5
6

関数内の関数

高階関数の最も強力な側面の一つは、関数内で関数を定義できることです。以下にその実現方法を見てみましょう。

インスタンス

-> module(helloworld). 
-> export([start/> 0]). 
start() -> 
   Adder = fun(X) -> fun(Y) -> io:fwrite("~p~n",[X + Y]) end end, 
   A = Adder(6) 
   A(10)

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

  • 加法器は、fun(X)として定義された高階関数です。

  • 加法器関数fun(X)は、別の関数fun(Y)を参照しています。

上記のプログラムを実行すると、以下のような結果が得られます。

出力

16