目次
PHPでカリー化を使ってみたよ
2つの値を記号でつないでくれる関数を作った
変数 x
と変数 y
を記号でつないで1つの文字列として出力してくれる関数を作りたい。もちろん、単純に2つの値を記号でつなぐだけなら2個以上の引数を用意してこういう書き方もできる。
fn (string $x, string $y): string => "$x ~ $y"
しかし、カリー化を勉強したい
しかし、今回はその関数の取る引数を分割し、関数の呼び出しの連続にするような形にして、それぞれの関数が引数を1つしか取らないように作り変えてみる。いわゆるカリー化っぽいもの。
ちなみにPHPのリファレンスではカリー化などという仰々しい単語は使わずに、アロー関数をネストするユースケースにだけ言及している。
https://www.php.net/manual/ja/functions.arrow.php#example-186
そうしてできたのがこれ。上のアロー関数を使用しないパタンは書いていて非常にダルいので下のアロー関数を使う方法がおすすめ。
$format_tilde = function (string $x) {
# こんなに関数が長くなるようなら関数宣言を使った方が良いw
return function (string $y) use ($x): string {
return "$x ~ $y";
};
};
# おすすめ
$format_slash = fn (string $x) => fn (string $y): string => "$x // $y";
とりあえず使ってみる。
これは、アーティスト名とそのアーティストが作ったトラック名を先ほどの$format_tilde
に通すことで、それぞれをつないだ文字列を返す手続きである。複数の値をまとめて処理したかったので、配列としてまとめてarray_map()
の中で呼び出されるコールバック関数の中に組み込んで使ってみた。カリー化関数を使うときは、呼び出し時にカッコを繋げて呼び出しが連続するように書く。
$tracks_with_artists = array_map(
fn ($x, $y) => $format_tilde($x)($y),
['遅梅雨', "Petrichor's session", 'ファフロツキーズ', '酸紅涙', '雨と虹の傘', 'Me with Seagulls'],
['1223', 'kre4tive', 'おさかな', 'さたん', '運命のドツボ', 'Yokkin']
);
print_r($tracks_with_artists);
出力
Array
(
[0] => 遅梅雨 ~ 1223
[1] => Petrichor's session ~ kre4tive
[2] => ファフロツキーズ ~ おさかな
[3] => 酸紅涙 ~ さたん
[4] => 雨と虹の傘 ~ 運命のドツボ
[5] => Me with Seagulls ~ Yokkin
)
他のケースでも使ってみる。今度は、$format_tilde
ではなく$format_slash
を呼び出してみた。
$group_name = 'sanctunes';
$group_name_added = array_map(
fn ($x) => $format_slash($group_name)($x),
$tracks_with_artists
);
出力
Array
(
[0] => sanctunes // 遅梅雨 ~ 1223
[1] => sanctunes // Petrichor's session ~ kre4tive
[2] => sanctunes // ファフロツキーズ ~ おさかな
[3] => sanctunes // 酸紅涙 ~ さたん
[4] => sanctunes // 雨と虹の傘 ~ 運命のドツボ
[5] => sanctunes // Me with Seagulls ~ Yokkin
)
動作確認については終了。
不十分な数の引数を与えてみる
気になったので、未完成状態の関数の様子を、print_r
に突っ込んで見てみた。
無名関数は、Closureオブジェクトを生成するので、型がClosure Object
になっているのはわかる。これらの無名関数がとる引数は、それぞれ連想配列として渡され、前もって引数で与えられている値はstatic
というキーを持った連想配列として、まだ不定の部分はparameter
というキーを持った連想配列として渡されるようだ。
parameter
の部分は、値が必要である(required
)状態を示している。
$format_tilde = fn (string $x) => fn (string $y): string => "$x ~ $y";
print_r($format_tilde('遅梅雨'));
出力
Closure Object
(
[static] => Array
(
[x] => 遅梅雨
)
[parameter] => Array
(
[$y] =>
)
)
おわり
PHPのアロー関数、JSの成り下がりみたいでおもしろいし、普通の関数同様に型を書けるのもありがたい。
関連投稿
Pythonで対話的UIを実装したいときはreadlineモジュールを使おう
Pythonのreadlineモジュールを使って、インラインで修正ができる対話的UIを実装します。 続きを読む
コメント
コメントはありません。