Erlang-楽しい
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).
上記のプログラムについては、以下の点に注意する必要があります。
Adderは、fun(X)として定義される高階関数です。
Adder関数fun(X)には、別の関数fun(Y)への参照があります。
上記のプログラムを実行すると、次の結果が得られます。
出力
16