Erlang OTP 17.0のリリースページに次のような文言があります。
- Funs can now be given names
URL: Erlang OTP 17.0 has been released
しれっと書かれていますが、これは何ができるようになったのか。
サンプルがあまりなかったので自分で書くことにしました。
先に要約しておくと「fun(無名関数)に名前が与えられるようになる」ということです。 (僕の中では、「無名とは!?」という気持ちですが、何かいい用語はあるのでしょうか…?「有名関数」?)
よくある階乗のコードを関数ではなく無名関数で書くことにします。
1> Fact = fun Fact (0, Acc) -> Acc;
1> Fact (N, Acc) when N > 0 -> Fact(N-1, N*Acc)
1> end.
#Fun<erl_eval...>
2> Fact(10, 1).
3628800
3>
表題の仕様の追加で、上のように、funに名前が付けられるようになり、その無名関数内でその関数を使うことができるようになります。
ちなみに同じことを R16B03 でやると、
1> Fact = fun Fact (0, Acc) -> Acc;
1> Fact (N, Acc) when N > 0 -> Fact(N-1, N*Acc)
1> end.
* 1: syntax error before: '('
1>
と怒られてしまいます。
R16B03 で同じようなことをやろうとすると、関数を一つ引数で取る必要があります。
1> Fact = fun (_, 0, Acc) -> Acc;
1> (Fun, N, Acc) when N > 0 -> Fun(N-1, N*Acc)
1> end.
#Fun<erl_eval...>
2> Fact(Fact, 10, 1).
3628800
3>
以上!