ラムダ計算とプログラミング言語の関係は何ですか?[閉まっている]


13

来年はコンピューターサイエンスの最初の1年(大学)を開始し、ほとんどCで書きます(それが問題になる場合)。私は検索を試みましたが、私が見つけるもののほとんどはラムダ計算の知識を前提としています。プログラミングでラムダ計算が単一変数計算よりもはるかに有用であると考えられるのはなぜですか?ラムダ式と関数型プログラムの間に関係はありますか?プログラミング言語の開発に影響を与えたのは、ラムダ計算に関するアロンゾ教会の仕事でしたか?

学校の外の誰もがそれについて騒ぎ続けており、私はそれを学び、それがプログラミングとプログラミング言語の理解に直接関係することを熱望しているにもかかわらず、彼らが何について話しているのか見当がつかない。


2
この質問はcs.stackexchange.comでより適切に回答されます
davidk01

@ChrisF。たぶん、この質問は、コンピューターサイエンスのサイトの1つに適しています。そうでない場合、私はそれを絞り込もうとし、現在の形で再び開くことができるかどうか疑問に思います。
トム・金

Mathematicaにはラムダ計算が組み込まれており、誰も言及していないことに気付いています。
ウィリアム

回答:


26

ラムダ計算は興味深く、エレガントで、関数型プログラミング言語の理解をはるかに容易にします。ただし、通常のCS学士課程ではLCに出会うことはないので、今すぐ習得する必要はありません。ラムダ計算を再検討する前に、まず関数型言語を試すことをお勧めします。OCamlはCプログラマーのための関数型プログラミングの良い出発点であり、そのSchemeはLambda Calculusに飛び込むための良い出発点だと思います。

ラムダ計算は、計算とは関連付けられていません(代わりに分析と呼ばれるべきです)。一般に、微積分は「形式的なシステム」、つまり何かをするための一連のルールです。微分計算は値の変更に関する規則を提供しますが、ラムダ計算の規則は計算自体を記述します。この非常に基本的なルールのセットから、任意の計算、ブール値、整数、リストなどのデータ表現、さらに条件やループなどの制御フロー構造を構築できます。LCはチューリングマシンに相当しますが、どちらのモデルにも異なる強度があります。

ラムダ計算はプログラミング言語に多大な影響を与えました。実装される2番目の高レベル言語はLispで、これはLCをプログラミング言語に直接エンコードすることとして理解できます。この「関数型プログラミング」は、プログラミング言語の進化に大きな影響を及ぼします。匿名関数、関数ポインター、クロージャー(ネストされた関数)、ガベージコレクション、変数スコープ、メタプログラミング、型システムの進歩、型推論、インタープリター型言語、動的型付け言語、オブジェクト指向プログラミングなどの機能はすべて大部分が負っていますプログラミング言語の関数型プログラミング部門へ。新しい(アカデミックでない)プログラミング言語は、Lispがすでに何十年も持っている機能を追加するだけであるというジョークがあります。

それを超えて、ラムダ計算および他の関連する計算は、プログラミング言語理論および特定のコンパイラ構築技術において不可欠なツールです。

クロージャとして動作し、すぐに自由に渡すことができる匿名関数を持つ言語には、ラムダ計算のエンコーディングが含まれています。無名関数はラムダ式に対応しますが、LC関数では常に正確に1つの引数があります。ただし、チューリング完全言語はLCと同等であるため、LCは常にそのような言語の上に実装できます。これは、ルール一致システムまたは非常にインテリジェントな構成形式で発生する傾向があり、「Greenspunの10番目のルール」(ほとんどの場合)が発生します。「十分に複雑なCまたはFortranプログラムには、 、Common Lispの半分の実装が遅い。


これは私が以前に選択したものよりも良い答えです。あなたの答えは本当に当たります。これはまさに私が探していたものです!
RonaldMunodawafa

「... LC関数の引数は常に1つだけであることを除いて」:この機能はカリーと呼ばれますか、それとも少なくとも関連していますか?
ジョルジオ14年

@Giorgio Curryingは異なりますが、関連しています。LCには複数の引数を持つ関数はありませんが、それらはそれぞれ1つの引数を取るネストされた関数として単純にエンコードできます。ML表記を使用した例:x = fn (a, b, c) => a + b + c(type int * int * int -> int、invocation fn (1, 2, 3))はx = fn a => fn b => fn c => a + b + c(type int -> int -> int -> int、invocation ((x 1) 2) 3– MLでは省略可能な括弧)に変換できます。これで、3つの引数すべてを指定する代わりに、plus3 = x 1 2typeを持つ2つのみを指定できint -> intます。これは部分的なアプリケーション/カリーです。
アモン14年

カリー化とは、すべての関数に引数を1つだけ持たせることを意味します(LCのように)。
ジョルジオ

8

ラムダ計算は微分/積分計算とは関係ありません。単語の最も一般的な意味での微積分は、計算のシステムを意味します。

非常に高いレベルでは、ラムダ計算は、チューリングマシンが計算のモデルであるのと同じように、計算のモデルです。プログラミング言語の研究者がラムダ計算を研究する理由は、モデルとして、論理やカテゴリー理論などの数学の形式的手法との強いつながりがあるためです。したがって、これらのドメインのメソッドは、ラムダ計算のさまざまな側面と拡張の研究に適用でき、特定のプロパティを持つより良いプログラミング言語の設計に役立ちます。

プログラミング言語におけるラムダ計算の最も直接的な影響は、通常、ファーストクラスの関数とクロージャーの形で現れます。Cはクロージャをサポートしていないため、Lisp、Python、Ruby、JavaScriptなどのより高レベルの言語で概念を検討する必要があります。歴史的にLispは、ラムダ計算のプログラミング言語としての最初の具体的な実装と考えられています。


1
Lispなど、ラムダ計算に非常に近い特定の言語に言及することもできます。
ジョルジオ14年

1
私はまだSICPを使ってSchemeを学んでいますが、この分野についてもっと学びたいと思っています。あなたの精巧な答えと提案をありがとう。
RonaldMunodawafa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.