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