ラムダ計算とプログラミング言語
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/04/12 16:37 UTC 版)
「ラムダ計算」の記事における「ラムダ計算とプログラミング言語」の解説
ピーター・ランディン(英語版)は1965年に発表したA Correspondence between ALGOL 60 and Church's Lambda-notationにおいて、ラムダ計算が手続的な抽象化と手続き(サブプログラム)の適用のしくみを提供しているがために、多くのプログラミング言語がラムダ計算にその基礎を置いているとみることができるとしている。 ラムダ計算をコンピュータ上に実装するには、関数を第一級オブジェクトとして取り扱う必要があり、これはスタック・ベースのプログラミング言語においては問題となってくる。これはFunarg問題(英語版)として知られている。 ラムダ計算と最も密接な関係をもつプログラミング言語は関数型言語と呼ばれる諸言語で、本質的にはいくつかの定数とデータ型を用いてラムダ計算を実装している。Lispでは関数の定義にラムダ記法の一変形を用いており、さらに、純Lispと呼ばれるLispのサブセットはラムダ計算と真に等価になっている。 関数を第一級オブジェクトとして扱えるのは関数型言語だけというわけではない。Pascalなど、多くの命令型言語ではある関数を他の関数の引数として与える操作が許されている。CやC++では関数を指すポインタやクラス型関数オブジェクトを用いて同じことが実現できる。このような機能はサブ関数が明示的に書かれている場合にのみ用いることができ、したがってこの機能がそのまま高階関数をサポートしていることにはならない。いくつかの手続的なオブジェクト指向言語では関数を任意の階数に書くことができる。Smalltalkや、より最近の言語ではEiffel(エージェント)やC#(デリゲート)などで用意されている機能がそれである。例えば、Eiffelのインライン・エージェントの機能を用いた以下のコード agent (x: REAL): REAL do Result := x * x end はラムダ式 λx. x * x (値呼び出し)に相当するオブジェクトを表している。このオブジェクトは他のあらゆるオブジェクトと同様に、変数に代入したり関数に渡したりすることができる。変数 square の値が上のエージェントのオブジェクトであるとすれば、 square に値 a を適用した結果(β-簡約)は square.item([a]) と書ける。ただしここでの引数はタプルであるとみなされる。
※この「ラムダ計算とプログラミング言語」の解説は、「ラムダ計算」の解説の一部です。
「ラムダ計算とプログラミング言語」を含む「ラムダ計算」の記事については、「ラムダ計算」の概要を参照ください。
- ラムダ計算とプログラミング言語のページへのリンク