4

コードの見た目、感触、ラムダ計算の抽象化のように動作するという点で、ラムダ計算に最も近い FP 言語はどれですか?

4

2 に答える 2

6

これは本当の答えではないかもしれません。実際に何を望んでいるのかについての推測です。

一般に、ラムダ計算にはほとんど何もありません。基本的には、(ファーストクラスの) 関数、関数の適用、および変数が必要です。最近では、これらのことを提供しない言語を見つけるのに苦労しています...しかし、それについて学ぼうとすると、物事が混乱する可能性があります-たとえば、単純な数字を使用するのは非常に簡単です.そして、それらを教会の数字と混同します。(私はこれが多くの学生で起こるのを見てきました.この資料に必要な種類の正式な考え方に適応することは非常に難しいため、エンコーディングを山に投げても実際には役に立ちません...)

Don が言ったように、Scheme は「単純な」型指定されていないラムダ計算に非常に近いため、The Little Schemer を使用している場合は、おそらく非常に適しています。本当に「適切な」LC を使用したい場合は、関数のみを使用するようにする必要があります (上記の問題)。しかし、特にこの主題に関する他のさまざまなテキストを読んだときに、いくつかの追加の問題に遭遇するでしょう。まず、ほとんどのテキストは、Scheme では得られない遅延評価を使用します。第 2 に、LC には単項関数しかないため、項を短縮して使用することは非常に一般的です。たとえば、この場合はScheme のorでλxyz.zxyある「実際の」形式の代わりに使用します。(これはカリー化と呼ばれます。)λx.(λy.(λz.((z x) y)))(lambda (x) (lambda (y) (lambda (z) ((z x) y))))

そうです、Scheme は LC にかなり近いですが、これらすべての問題についてあまり語っていません。Haskell はどちらも怠惰であり、関数への複数の引数に対してその種のカリー化を行うため、間違いなくより良い候補です。OTOH、このゲームに持ち込むにはかなり大きな荷物である型付き言語を扱っています-TLSスタイルの例を実行しようとすると、深刻な泥沼に陥ります...

すべてを取得したい場合 (レイジー、略記、型なし、Scheme に十分近い)、Racketには考慮すべき別のポイントがあります。高レベルでは、Scheme に非常に近いですが、Racket 言語の制限である言語をlambda式と関数の適用のみにすばやく平手打ちできるという点で、Scheme に非常に近いものです。もう少し手を加えると、カリー化を行うこともできますし、レイジーにすることもできます。これは、この時点で実際に自分でやってみる必要のある演習ではありません。しかし、それがあなたのやりたいことのように思われる場合は、私のコース(クラス ノートで「Schlac」を探してください) を紹介することができます。上記のすべてを行っていますが、非常に制限されているため、基本的な LC 構造しか得られません。(例えば、3これはインタープリターではないことに注意してください。これは、Racket コードにコンパイルされているため、数値を使用するコードを記述できるほど高速に実行されますその言語の実装もそこで入手できます。それをインストールすると、ファイルを で開始すると、この言語を入手できます#lang pl schlac

于 2012-05-17T16:11:37.990 に答える
3

ラムダ計算は、非常に制限されたプログラミング モデルです。機能しかありません。リテラル、組み込みの算術演算子、データ構造はありません。すべてが関数としてエンコードされます。そのため、ほとんどの関数型言語は、日常のプログラミングをより便利にする方法でラムダ計算を拡張しようとします。

Haskell は、ラムダ計算の最新の拡張機能をコア言語として使用しています:データ型で拡張されたSystem Fです。(GHC はこれをさらにSystem Fcに拡張し、型等価強制をサポートしています)。

すべての Haskell はそのコア言語で直接書くことができ、そのコア言語は型付きラムダ計算 (具体的には 2 次ラムダ計算) の拡張であるため、Haskell はラムダ計算に厳密に従い、並行性のために組み込み演算子をモジュロすると言えます。 ; 並列性; およびメモリの副作用(およびFFI)。これにより、新しいコンパイラ最適化の開発が大幅に容易になり、特定のプログラムのセマンティクスが理解しやすくなります。

一方、Scheme は型指定されていないラムダ計算の変形であり、副作用やその他の非ラムダ計算の概念 (同時実行プリミティブなど) で拡張されています。型なしラムダ計算に厳密に従っていると言えます。

これが重要なのは、ラムダ計算を学んでいる人だけです。そしてコンパイラライター。

于 2012-05-17T14:36:42.063 に答える