Erlang-funs

提供:Dev Guides
移動先:案内検索

アーラン-ファン

Funは、Erlangで匿名関数を定義するために使用されます。 匿名関数の一般的な構文は以下のとおりです-

構文

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

どこで

  • 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

関数内の関数

高階関数の他の最も強力な側面の1つは、関数内で関数を定義できることです。 これを達成する方法の例を見てみましょう。

-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