高階関数の例 (3/3)


apply を使おう

もう一つの高階関数の例として、apply を挙げておきます。 apply の基本的な使い方は、関数とその引数をリストにしたものをもらい、 関数に引数を適用した値を返すものです。
>(apply + '(1 2 3))
6
例えば、map と apply をつかって 1 * 1 + ... + n * n を以下の様に表現することも出来ます。
(define (enumerate-interval begin end) ; begin から end までの整数のリストを返す関数
  (if (> begin end)
      '()
      (cons begin
            (enumerate-interval (+ 1 begin)
				end))))
-------------
> (apply + (map square (enumerate-interval 1 10))) ; 1 * 1 + .. + 10 * 10
385
つまり、まず、 (1 2 .. 10) を作っておき、その square のリストを作り、 それを引数として + に適用(apply)しています。

apply に関する詳しい情報はこちら

おまけ: 引数の数が不定な関数の定義

apply のついでというわけではないのですが、 引数の数が不定な関数の定義の仕方を教えておきます。 例えば、以下の foo は、引数は 2つ以上で、始めの二つを x y として束縛し、 残りの引数をリストにしたものを rest に束縛します。 これで、あとは残った引数をリストとして好きに扱うことができます。

但し、この使い方は、DrScheme では、FullScheme Mode にしないと使えません。

> (define (foo x y . rest)
    (list x y rest))
> (foo 0 1 2 3 4 5 6)
(0 1 (2 3 4 5 6))
> (foo 0 1)
(0 1 ())

99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp