3

この質問は、パートナーが今日遭遇したいくつかの構文に関するものであり、その仕組みは理解していますが、なぜ許可されているのか (その用途は何ですか?) は理解していません。

このスニペットを見てください:

fun() -> ok end().

括弧の最後のペアがないと、次のようになります。

#Fun<erl_eval.20.82930912>

しかし、それらを使用すると、関数が評価されて次のようになります。

ok

私の質問は、なぜその構文が Erlang で許可されているのですか? 内容を書き出すだけでなく、すぐに呼び出すためだけに関数を作成する必要があるのはなぜですか? 実用的な用途はありますか?

私たちが考えることができる唯一のことは、fun の本体内にローカル変数を導入することでした (しかし、それは見苦しく、不明瞭に見えます)。

この他の構文は、前者と同じ概念に従っていますが、Erlang では許可されていないことに注意してください。

fun() -> fun() -> ok end end()().  

(これは、関数 B を返す関数 A を意味します。そして、私は A を評価し (したがって B を生成し)、次に B を評価して を取得します'ok')。

4

2 に答える 2

9

あなたが言及した構文は、Erlang が機能していることの自然な結果です。

Erlang では、関数は値です (クロージャとして格納されます)。

の値fun() -> ok endは関数であり、何も取らずに を返しますok。後ろに括弧を置くと、その関数を呼び出しています。これを示す別の方法は次のとおりです。

 > F = fun() -> ok end.  
 #Fun<erl_eval.20.80484245>
 > F().                  
 ok

2 番目の例の関数は、パーサーがそれらを理解できるように適切にグループ化する必要があります。

「なぜこの構文が許可されているのか」という質問については、Erlang では関数が値であるという自然な結果だと言わざるを得ません。この機能により、プログラミングの関数型スタイルが可能になります。次に例を示します。

 > lists:map(fun(X) -> X * 2 end, [1,2,3]).
 [2,4,6]

上記のコードは本質的にこれです:

 > [fun(X) -> X * 2 end(1), fun(X) -> X * 2 end(2), fun(X) -> X * 2 end(3)].
 [2,4,6]

「自然な結果」は単なる自然な結果であり、実際に使用する必要はありません。したがって、使用されているようなコードを目にすることはおそらくないでしょう(fun() -> fun() -> ok end end())().:)

于 2013-09-12T23:26:55.920 に答える