第16回 無名関数をもっと理解する

さて、前回は、
配列全要素に対してなにか処理したものを配列として受け取れる map について見てきました。
今回は、また無名関数の話題に戻します。


無名関数をもう一度よく見てみましょう。

use strict;

# 無名関数
my $f = sub { print "無名の世界から、こんにちは\n"; };

# 無名関数を実行
$f->();

結果:

無名の世界から、こんにちは


無名関数ですが、関数ですので、もちろん引数も受け取れます。

use strict;

# ふつうの関数のように引数も受け取れる
my $f = sub {
              my ($x, $y) = @_;

              print "$x\n";
              print "$y\n";
            };

# 無名関数を実行
$f->('無名の世界へ引数を与える', 'こんにちは');

結果:

無名の世界へ引数を与える
こんにちは


これで、普通の関数となんら変わらないことがわかっていただけたと思いますが、
今や、関数はスカラーな変数から呼び出せるわけです。 そうスカラーな変数。

配列も、リファレンスを取得してスカラーな値にしてから関数に渡しました。
そうなんです、無名関数は、他の関数の引数として渡すことができるのです!!!

use strict;

# 無名関数受け取る、名前のある関数
sub hoge {
  my $c = shift;

  print "hoge関数の中です\n";
  $c->();
}


# 無名関数取得
my $f = sub { print "わたしを誰かよびだして〜\n" };


# 無名関数を引数にして hoge関数を実行
hoge($f);

結果:

hoge関数の中です
わたしを誰かよびだして〜


このような、
「関数を受け取る関数」を高階関数(こうかいかんすう)と呼びます。


さて、ここで、 map をもう一度見てみましょう。

my @plus_ones = map { $_ + 1 } @array;

こうなっているわけです。



{ } の前に sub をつけると!?

my @plus_ones = map sub {  } @array;  # こんなものは存在しない 嘘プログラミング

おや、

map( sub{  }, @array );

と map という関数に無名関数を渡したように見えます。


このように、関数に、「関数を渡す/受け取る」という行為 つまり、高階関数が使えるプログラミング言語は、
かなり強力なことが可能となります(mapの例は、あくまで高階関数のように見えるという例ですが)。


ちなみに、最近のJavaScriptは、この高階関数をつかったプログラム手法が大流行り!なのはご存知のとおりかと思います。

それではまた〜




もっと知りたいひとへの参考資料:
ビンゴ中西のほげほげ相方の どう書く? を読む
ビンゴ中西のほげほげPerl の map を体験してみる
ビンゴ中西のほげほげ学びたいことが多すぎる


http://perl-mongers.org/2009/01/post_5.html
http://perl-mongers.org/2009/01/map.html
http://perl-mongers.org/2009/01/re_map.html