著者: (1) David Binder, University of Tübingen, ドイツ (2)マルコ・ツェンケ、ドイツ・チュービンゲン大学 (3)マリウス・ミュラー、ドイツ・チュービンゲン大学 (4)Klaus Ostermann、ドイツのチュービンゲン大学。 Authors: (1) David Binder, University of Tübingen, ドイツ (2)マルコ・ツェンケ、ドイツ・チュービンゲン大学 (3)マリウス・ミュラー、ドイツ・チュービンゲン大学 (4)Klaus Ostermann、ドイツのチュービンゲン大学。 左のテーブル Introduction Translating To Sequent Calculus 2.1 Arithmetic Expressions 2.2 Let Bindings 2.3 Top-level Definitions 2.4 Algebraic Data and Codata Types 2.5 First-Class Functions 2.6 Control Operators Evaluation Within a Context 3.1 Evaluation Contexts for Fun 3.2 Focusing on Evaluation in Core Typing Rules 4.1 Typing Rules for Fun 4.2 Typing Rules for Core 4.3 Type Soundness Insights 5.1 Evaluation Contexts are First Class 5.2 Data is Dual to Codata 5.3 Let-Bindings are Dual to Control Operators 5.4 The Case-of-Case Transformation 5.5 Direct and Indirect Consumers 5.6 Call-By-Value, Call-By-Name and Eta-Laws 5.7 Linear Logic and the Duality of Exceptions Related Work Conclusion, Data Availability Statement, and Acknowledgments 導入 タイピングルール 関連仕事 結論、データ可用性声明、および認定 A. Sequential Calculusとの関係 B.楽しく書くルール C. ラベル/ゴトの運用式学 参照 1 導入 テストするには、リストに含まれるすべての数を倍にする次の関数を書きます。 この実装についてあなたがバグしているのは、あなたが明らかな最適化を知っているということです: 関数はリストでゼロに遭遇した場合に直接ゼロを返すべきです。これを達成する方法はたくさんありますが、あなたはラベルされた表現とゴトの指示で言語を拡張することを選択します。 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に、次に あなたが見たばかりの λμμ ̃-calculus は、 Curien と Herbelin [2000] によって、長い間開かれた質問に対する解決策として最初に導入されました: 連続計算のための用語言語は何のように見えるべきですか? 連続計算は、Gentzen [1935a,b] によって1つの論文に導入された2つの影響力のある証拠計算の一つであり、他の計算は自然推定である。自然推定のための用語言語は普通のランダ計算であるが、連続計算のための良い用語言語を見つけるのは困難でした。 発見された後、 λμμ ̃-calculus は、コンパイラー中間言語のためのより良い基盤として提案された、例えば、Downen et al. [2016] にもかかわらず、 私たちはしばしば、学生や同僚と λμμ ̃-calculus を含むアイデアを議論し、その中心的なアイデアにそれらを紹介しなければなりませんが、通常、我々は λμμ ̃-calculus を連続計算の用語割り当てシステムとして動機づけることはできないので、それらのほとんどはそれに馴染みがありません。我々は代わりに、白板上の λμμ ̃-calculus を小さな機能的なプログラムをそれにまとめ込むことで説明します。そのような導入は残念ながらまだ出版された文献に欠けています。 ほとんどの既存のプレゼンテーションは、連続計算の知識を前提としているか、あるいはそれらを最初に導入することに多くのスペースを費やします。 我々は、 なぜ我々は λμμ ̃-calculus について興奮しているのか、そしてなぜ我々はより多くの人々がその中心的なアイデアや概念に精通すべきだと考えているのか? λμμ ̃-calculus を lambda 計算から区別する主な特徴は、その評価コンテキストのファーストクラスの取り扱いである。 評価コンテキストは、現在のサブ表現の後に実行されるプログラムの残りの部分であり、我々は完成を評価することに焦点を当てている。 これは例で明らかになる: 表現 (2 + 3) ∗ 5 を評価するとき、我々はまずサブ表現 2 + 3 に焦点を当て、その結果にそれを評価する必要があります 5. プログラムの残りは、我々が評価を完了した後実行されますが、評価コンテキスト □ ∗ 5 で表すことができます。 我々は、 □ ∗ 5 のような評価コンテキストをランダ型計算の変数に直接接続することは、必ずしもアプリケーションを書きたいプログラマーには必要ではありませんが、このような評価コンテキストをコバリアブルに結び付けることはよくあります。 さらに、 μ-オペレーターは、表現が現在評価されている評価コンテキストへの直接アクセスを与えます □ ∗ 5 が現在評価されている傾向を表すために使用されます。 この論文の残りの部分は次のように構成されています。 • セクション 2 では、表面言語 Fun を導入し、次数計算に基づく言語 Core に翻訳する方法を示します。表面言語は主に表現指向の機能プログラミング言語ですが、コダタタイプやコントロールオペレーターなどのいくつかの機能を追加し、その翻訳は λμμ ̃-calculus がどのように機能するかについて重要な洞察を提供します。 • セクション3では、静的およびダイナミックな焦点化について議論します、これは、値ではないサブ表現を評価できる位置に引き上げるための2つの密接に関連するテクニックです。 • セクション4は、FunとCoreの入力ルールを紹介し、入力と評価に関する標準的な結果を証明します。 われわれは、 λμμ ̃-calculus でそれらを提示すると、より明確になるさまざまなプログラミング言語の概念を紹介する:われわれは、let-bindings が正確にコントロールオペレーターに二重であることを示し、データと codata タイプはタイプを指定する完全に二重の方法であり、ケース-of-case 変換は μ-reduction に過ぎないことを示す。 • 最後に、セクション6では、関連する作業について議論し、さらなる読書のための指針を提供します。 この論文には、インタラクティブなウェブサイトとして提供するHaskellの実装が付属しています(図1参照)。 この論文は、CC BY 4.0 ライセンスの下で archiv で提供されています。 この紙は CC BY 4.0 ライセンス ARCHIV で利用可能 ARCHIV で利用可能 [1] 興味のある読者にとっては、附属書Aでは、順序計算と λμμ ̃-計算がどのように関連しているかを示します。