web-dev-qa-db-ja.com

ラムダ計算を知ることはどの程度役に立ちますか?

lambda calculus を知っているすべての人にとって、プログラミングに関してどのような利点がありますか?人々にそれを学ぶことを勧めますか?

71
TraumaPony

関数型プログラミング言語 でプログラミングしたい場合、それは不可欠です。つまり、チューリングマシンについて知っておくとどのくらい便利ですか。まあ、Cを書くと、言語のパラダイムはチューリングマシンに非常に近くなります。命令ポインターと現在の命令があり、マシンは現在の状態でなんらかのアクションを実行してから、次の命令に移動します。

関数型言語では、そのように考えることはできません。それは言語のパラダイムではありません。ラムダ計算と、そこでの用語の評価方法を考え直す必要があります。ラムダ計算を知らないと、関数型言語で効果を発揮するのがはるかに難しくなります。

26
EfForEffort

ラムダ計算の利点は、チューリングマシンと同等の非常に単純な計算モデルであることです。しかし、チューリングマシンはアセンブリ言語に似ていますが、ラムダ計算は高級言語に似ています。そして、もしChurch encodingsを学べば、それはcontinuation-passing styleと呼ばれるプログラミング手法を学ぶのに役立ちます。これは、バックトラック検索やその他のきちんとしたトリックの実装に非常に役立ちます。

ラムダ計算の実際の主な用途は次のとおりですこれは新しいプログラミング言語のアイデアを研究するための優れたラボツールです。新しい言語機能のアイデアがある場合は、新しい機能をラムダ計算に追加して、プログラミングに十分な表現力であるものを取得できます非常に徹底的に勉強するのに十分簡単。この使用法は、プログラマーよりも言語デザイナーや理論家の方に適しています。

ラムダ計算は、それ自体が非常に優れています。アセンブリ言語を知っているように、計算の理解を深めるです。ラムダ計算でユニバーサルチューリングマシンをプログラムするは特に楽しいです。しかし、これは基礎的な数学であり、実用的なプログラミングではありません。

80
Norman Ramsey

正直に言うと、関数型プログラミングの前にラムダ計算を学ぶことで、Cは命令型プログラミングとは無関係であることに気づきました。

ラムダ計算はa関数型プログラミング言語であり、難解なものであり、チューリングターピットです。偶然にもそれが最初です。

ほとんどの関数型プログラミング言語では、ラムダ計算を「学習」する必要はまったくありません。つまり、ラムダ計算はめちゃくちゃ最小限であり、その公理を1時間未満で「学習」できます。その結果を知るには、固定小数点定理のように、Church-Rosser定理などは関数型プログラミングとは無関係です。

また、ラムダ抽象化はしばしば「関数」であると見なされますが、私はそれに同意しません。それらは関数ではなくアルゴリズムであり、小さな違いです。ほとんどの「関数型言語」は、古典的な数学のように関数をより扱います。

ただし、たとえばHaskellを効果的に使用するには、ラムダ計算に関係なく、特定のtype systemsを理解する必要があります。SystemF型システムはすべての「関数」に適用でき、ラムダ抽象化をまったく必要としません。一般的に数学では、f:R ^ 2-> R:f(x)= x ^ 2と言います。 f(x)= x ^ 2 :: R-> R-> Rと言っても過言ではありません。実際、Haskellはこの表記にかなり近づいています。

ラムダ計算は理論的な形式であり、Haskellの関数は実際にはfよりも「ラムダ抽象」ではありません:f(x) = x ^ 2本当に、ラムダ抽象を興味深いものにするのは、通常は「定数」と見なされるものを「関数」として定義しますが、計算オーバーヘッドが非常に大きいため、関数型言語はこれを行いません。Haskellなどは、システムFの制限された形式type systemとして関数に適用されます日常の古典的な数学で使用されます。Haskellの関数は、ラムダ計算の場合のように、匿名の正式なシンボリックな還元申請者ではありません。ほとんどの関数型プログラミング言語は、シンボリックな還元ベースの書き換えシステムではありません。Lispはある程度ですが、それはそれ自体のパラダイムとその「ラムダキーワード」は、ラムダ計算と呼ぶことに本当に満足していません。

22
Zorf

私は、実際のプログラミングに関するラムダ計算の使用は、抽象化(または「匿名関数」またはクロージャー)の本質を捉える非常に最小限のシステムであると思います。それ以外は、抽象化を自分で実装する必要がある場合を除いて、(Tetha( 114646 )が言及しているように)それ以外は、一般的に必須ではないと思います。

また、関数型プログラミングには不可欠であると言っているDenis Bueno( 114701 )にはまったく同意しません。ラムダ計算をまったく行わなくても、関数型言語を定義、使用、または理解することは完全に可能です。関数型言語での用語の評価(私の意見では、関数型言語の使用とは多少矛盾します)を理解するためには、用語書き換えシステムについて学習する方がよいでしょう。

15
mweerden

ラムダ計算を学ばなくても関数型プログラミングを理論的に学ぶことが可能であると言う人には同意します。しかし、ラムダ計算を学ばないことの利点は何ですか?時間の大きな投資が必要なわけではありません。

ほとんどの場合、関数型プログラミングをよりよく理解するのに役立ちます。しかし、そうでない場合でも、学ぶ価値のあるクールなことです。 Y-combinator は美しさです。

12
Michael Dorfman

技術者になってプログラムを作成したいだけの場合は、ラムダ計算、有限状態機械、プッシュダウンオートマトン、正規表現、文脈自由文法、離散数学などを知る必要はありません。

しかし、もしあなたがこのものの根底にあるより深い謎について好奇心を持っているなら、あなたはこれらの質問がどのように答えられるのか疑問に思うようになり始めることができます。コンセプトは美しく、あなたの想像力を広げます。また、偶然にも、彼らはより良い開業医になると思います。

私を夢中にさせたのは、Minskyの著書Computation:Finite and Infinite Machinesでした。

10
Mike Dunlavey

ラムダ計算を学ぶ1つの可能な方法は

http://en.wikipedia.org/wiki/Lambda_Calculus

または、もっと知りたい場合は、ラムダ計算などのブログをここに掲載します

http://weblogs.manas.com.ar/lziliani/

計算のあらゆる抽象化として、ラムダ計算を使用すると、サブタイピングなど、ほとんどのプログラミング言語で使用されるものをモデル化できます。これについての詳細は、この意味でのラムダ計算の実用的な使用法がある最高の本の1つです。

http://www.Amazon.com/Types-Programming-Languages-Benjamin-Pierce/dp/0262162091/ref=sr_1_1?ie=UTF8&s=books&qid=1222088714&sr=8-1

4
Beta

ラムダ計算は、関数型プログラミングがより深いレベルでどのように機能するかを理解するのに役立つことがわかりました。特に関数型言語の実装方法。

これにより、タイプシステムや評価戦略などの高度な概念(たとえば、名前による呼び出しと値による呼び出し)を理解しやすくなりました。

基本的な関数型プログラミング手法を使用するために、ラムダ計算について何も知る必要はないと思います。ただし、ラムダ計算を理解すると、高度なプログラミング理論を学ぶのが容易になります

4
cdiggins

ラムダ計算はチューリングマシンと同じように計算モデルです。したがって、このモデルに基づいて言語の特定のエバリュエーターを実装する必要がある場合に役立ちますが、実際には、基本的なアイデアが必要なだけです(ええと、引数を関数の本体に意味的に正しく配置しますか?)。それ。

4
Tetha

また、NLPの分野で何かをしている場合、ラムダ計算は、組成セマンティクスにおける膨大な量の作業の基礎となっていることにも触れておきたいと思います。

3
Robert Elwell

私にとっての利点は、よりコンパクトな相乗プログラミングです。ものは垂直よりも水平に流れる傾向があります。さらに、単純なアルゴリズムのプロトタイピングにも非常に役立ちます。それを最大限に活用しているかどうかはわかりませんが、非常に便利です。

0
Nick Berardi