74

ラムダ計算を知っているすべての人へ:プログラミングに関して、それはあなたにどのような利益をもたらしましたか?人々にそれを学ぶことを勧めますか?

4

11 に答える 11

85

ラムダ計算の利点は、チューリング マシンと同等の非常に単純な計算モデルであることです。しかし、チューリング マシンはアセンブリ言語に似ていますが、ラムダ計算は高級言語に似ています。また、Church エンコーディングを学ぶと、継続渡しスタイルと呼ばれるプログラミング手法を学ぶのに役立ちます。これは、バックトラッキング検索やその他の巧妙なトリックを実装するのに非常に役立ちます。

実際のラムダ計算の主な用途は、新しいプログラミング言語のアイデアを研究するための優れた実験ツールであることです。新しい言語機能のアイデアがある場合は、その新しい機能をラムダ計算に追加すると、プログラミングするのに十分な表現力を持ちながら、非常に徹底的に研究できるほど単純なものが得られます。この使用法は、プログラマーよりも言語設計者や理論家に適しています。

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

于 2008-12-17T08:06:36.100 に答える
28

関数型プログラミング言語でプログラミングしたい場合、それは不可欠です。つまり、チューリング マシンについて知っていることはどれほど役立つのでしょうか。C で記述した場合、言語パラダイムはチューリング マシンに非常に近くなります。命令ポインターと現在の命令があり、マシンは現在の状態で何らかのアクションを実行してから、次の命令に進みます。

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

于 2008-09-22T12:55:18.693 に答える
24

正直なところ、関数型プログラミングの前にラムダ計算を学んだことで、この 2 つが C と同様に命令型プログラミングと無関係であることに気づきました。

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

関数型プログラミング言語の大部分では、ラムダ計算を「学習」する必要はまったくありません。つまり、ラムダ計算は非常に最小限であり、その公理を 1 時間以内に「学習」できます。その結果を知るには、不動点定理のように、チャーチ・ロッサー定理などは関数型プログラミングとは無関係です。

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

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

ラムダ計算は理論的な形式主義であり、Haskell の関数は実際には f : f(x) = x^2 と同じ「ラムダ抽象化」ではありません。ラムダ抽象化の興味深い点は、通常「定数」と見なされるものを定義できることです。 「関数」のように、計算上のオーバーヘッドが大きいため、関数型言語はそれを行いません。Haskell などは、日常の古典的な数学で使用される関数に適用されるSystem F の型システムの制限された形式にすぎません。Haskell の関数は、ラムダ計算の場合のように、匿名の正式なシンボリック簡約適用子ではありません。ほとんどの関数型プログラミング言語は、シンボリック リダクション ベースの書き換えシステムではありません。Lisp はある程度ですが、それ自体がパラダイムであり、その 'ラムダ キーワード' は実際にはそうではありません。

于 2010-05-18T06:16:34.580 に答える
16

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

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

于 2008-09-22T13:35:30.000 に答える
13

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

ほとんどの場合、関数型プログラミングをよりよく理解するのに役立ちます。しかし、そうでなくても、学ぶ価値のある素晴らしいことです。Yコンビネータは美しいものです。

于 2008-09-25T12:28:07.580 に答える
11

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

しかし、このようなものの根底にあるより深い謎に興味がある場合は、これらの質問にどのように答えられるか疑問に思うかもしれません. コンセプトは美しく、想像力を広げてくれます。また、偶然にも、彼らはより良い実践者になると思います.

私が夢中になったのは、ミンスキーの本 Computation: Finite and Infinite Machines でした。

于 2008-12-23T14:53:27.287 に答える
5

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

于 2008-09-22T12:46:10.120 に答える
4

ラムダ計算を学ぶための 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

于 2008-09-22T13:06:23.987 に答える
4

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

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

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

于 2011-09-23T00:27:39.617 に答える
3

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

于 2008-10-11T06:06:29.977 に答える
0

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

于 2008-09-22T12:45:58.483 に答える