LoginSignup
4
4

More than 5 years have passed since last update.

Funs can now be given names(funに名前が付けられるようになりました)

Last updated at Posted at 2014-11-06

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> 

以上!

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4