結局は、高階関数概念の理解なのかな
高階関数をさまざまな側面から理解することが重要なのだ、と思う。
- 関数のパラメータ付けられた族(関数族)
- パラメータを、もう1つのの変数と思う
- たくさんの関数達の値をまとめて表示すると、2次元の表(マトリクス)になる
- これはすなわち2変数関数だろ
- 例えば、f(a, x) = a*x + 1 とすると、aをパラメータとする関数族ができる
- λx.f(a, x) はaを変数とする関数だ。
- aを具体化するということは、関数族のパラメータを具体的に1個指定すること
- 関数を生成する機構に具体パラメータを渡して生成する=高階関数
それと、高階関数とコンパイルの関係。これはコンピュータ屋さんには必須の認識だ。
- コンパイラとインタプリタにたいした差はない(教条的に考えないこと)
- コンパイル&ゴー方式とか考えてみよ
- 関数を生成する機構に具体パラメータを渡して生成する=高階関数
- 具体パラメータも一種のコードなのだ。
- うんと複雑なコードを考えたらどうなる?
- コードとデータから実行結果を出すのはマシンでしょう。
- コードとマシンで高階関数の実行がシミュレートできる
- マシンに食わせるコードを作るのがコンパイルやリンク
- 数学のマシンは自明な、自明すぎるマシン
要するに、現実世界で高階関数(に相当するモノ)を作る手順がコンパイルやリンク。
数学と現実では高階関数を作るコストが全然違う
本来のラムダ計算は記号の世界の計算だから、数学と同様なコスト。適用記号=実行エンジンを入れてもコストは安い。が、適用記号の導入により現実世界につながる定式化が得られたわけだ。