関数を値として用いる (2/2)


高階関数

関数を値として用いることができるなら、 関数を引数としてとるような関数も定義できるはずです。 例えば、先程の例なら、
> (define (apply-2-3 func)
    (func 2 3))
> (let ((func0 +)
        (func1 foo))
    (list (apply-2-3 func0) 
          (apply-2-3 func1)))
(5 9)
apply-2-3 は関数 func を引数としてとり、 それに 2 3 を渡して評価させようというものです。 このように関数を引数としてとる関数のことを 高階関数 と呼びます。

高階関数に関するお話

実は数学の世界でも高階関数は普通に現われていました。 例えば微分です。関数 f に対してその微分 f' を求める関数 D(f) を考えます。この D は 実関数 f に対して その導関数 f' をもとめる高階関数であると言えます。

関数の合成も例として考えられるでしょう。 g(x) = x * x があったとします。 h(x) = g(f(x)) = f(x) * f(x) とします。 このとき、f をどんな関数でもよいとすると、h という x に関する関数は f を引数とする関数にもなっているわけです(h = G(f) = f o g)。 この様に、高階関数は色々な所に現われていました。


関数の値と等価性に関するお話への導入

次は、関数の値のお話。Scheme では、関数の値は単に、 #<procedure:foo> などとしか答えてくれませんでした。 どうしてそれ以上の情報を教えてくれないのでしょう? それは こんな理由 があるのです、、、ということで、興味のある人は こちら


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