高階関数とラムダモードの使い方。
Apply関数
例
Apply関数は高階関数のうち最もシンプルなものの1つ。Apply関数は
- 関数
- 入力値のリスト
という2つの引数をとる。
apply関数はラムダモードの+関数(om+関数ではない)からもらった変数4つ持ちの関数を、取った入力値リスト(1 2 3 4)に適用する。すると1+2+3+4になって10が返る。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
apply関数はラムダモードの+関数(om+関数ではない)からもらった変数4つ持ちの関数を、取った入力値リスト(1 2 3 4)に適用する。すると1+2+3+4になって10が返る。
関数名を使う
関数の入力はラムダモードにした関数の他にも、関数名を使うことができる。
処理が速くメモリ消費も少なくなるので、できるだけ関数名を使った方がよいかもしれない。
+関数のようなものの場合、引数の数を考える手間が省けるというメリットもある。
処理が速くメモリ消費も少なくなるので、できるだけ関数名を使った方がよいかもしれない。
+関数のようなものの場合、引数の数を考える手間が省けるというメリットもある。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
インプットに関して
インプットの数は合ってないといけません、というお話。
arithm-ser関数がラムダモードになっている。apply関数は変数3つ持ちのarithm-ser関数とインプット2つのリストを当てはめようとするが、合わないのでエラーを吐く。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
arithm-ser関数がラムダモードになっている。apply関数は変数3つ持ちのarithm-ser関数とインプット2つのリストを当てはめようとするが、合わないのでエラーを吐く。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
この場合はapply関数がもらうのは変数2つの関数なので、インプット2つのリストと合わせることができる。
funcall関数
関数呼び出しの関数。apply関数と似ている。

この2つの意味はほとんど同じである。
違いはapply関数が引数[1]にインプットをまとめたリストを入れるのに対して、funcallは引数[1]以降で1つ1つのインプットを指定する点。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。

この2つの意味はほとんど同じである。
違いはapply関数が引数[1]にインプットをまとめたリストを入れるのに対して、funcallは引数[1]以降で1つ1つのインプットを指定する点。
funcall関数を用いて関数を呼び出す
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
rotate関数はリストの要素の順序を回す関数。デフォでは1つ回す。つまり2番目の要素から数え上げる。上図は数値のリスト(1 2 3)を入力する単純な例。
- funcall関数はラムダモードで出力されたrotate関数を(1 2 3)に適用する。
- ラムダモードでないrotate関数に直接(1 2 3)が入力されている。
この2つの計算結果は全く同じである。ではラムダモードの意義とは?実際の使われ方を見よう。
例:使う関数をランダムに選ぶ
複数の数値から1つを選ぶのと同じように、ラムダモードを使って複数の関数から1つを選ぶということができる。
permut-random関数とrotate関数のうちどちらかを選んでリストを処理させる例を見てみよう。
permut-random関数とrotate関数のうちどちらかを選んでリストを処理させる例を見てみよう。
- permut-random関数はリストの要素の順序をバラバラにする関数。
- rotate関数はリストの要素の順序を1つ回す関数(前例を見よ)。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
- permut-random関数とrotate関数はラムダモード。
- listは2つの関数のリストを作る。(#<[permut-random]> #<[rotate]>)のような。
- nth-random関数が2つの関数のうちどちらかを選ぶ。
- funcall関数は選んだ関数を(3000 6000 7000)のリストに適用する。
- 今回はpermut-random関数が選ばれたのでリスト要素の順番がバラバラになる。
もしpermut-random関数とrotate関数がラムダモードでなければどうなるか。その場合list関数に対してそれぞれ関数ではなく値を返すので(nil nil)というリストになってしまう。
そうするとfuncallが「nilって何だよ!関数じゃねえじゃねえか!関数持ってこいよ!」と怒ってしまう。
そうするとfuncallが「nilって何だよ!関数じゃねえじゃねえか!関数持ってこいよ!」と怒ってしまう。
#ref error :画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
添付ファイル