The study of polarity in computation has revealed that an "ideal" programming language combines both call-by-value and call-by-name evaluation; the two calling conventions are each ideal for half the types in a programming language. But this binary choice leaves out call-by-need which is used in practice to implement lazy-by-default languages like Haskell. We show how the notion of polarity can be extended beyond the value/name dichotomy to include call-by-need by adding a mechanism for sharing which is enough to compile a Haskell-like functional language with user-defined types. The key to capturing sharing in this mixed-evaluation setting is to generalize the usual notion of polarity "shifts:" rather than just two shifts (between positive and negative) we have a family of four dual shifts. We expand on this idea of logical duality -- "and" is dual to "or;" proof is dual to refutation -- for the purpose of compiling a variety of types. Based on a general notion of data and codata, we show how classical connectives can be used to encode a wide range of built-in and user-defined types. In contrast with an intuitionistic logic corresponding to pure functional programming, these classical connectives bring more of the pleasant symmetries of classical logic to the computationally-relevant, constructive setting. In particular, an involutive pair of negations bridges the gulf between the wide-spread notions of parametric polymorphism and abstract data types in programming languages. To complete the study of duality in compilation, we also consider the dual to call-by-need evaluation, which shares the computation within the control flow of a program instead of computation within the information flow.
翻译:计算中的极性研究显示, 一种“ 理想” 的编程语言结合了按要求值和按名评价; 两种调用公约对于一种编程语言中的一半类型都是理想的。 但是, 这种二进制选择会留下按要求计算的概念, 在实践中, 实施像哈斯凯尔这样的懒惰的按违约语言。 我们展示了如何将极性的概念扩大到价值/ 名二分法之外, 通过添加一个共享机制, 将一种类似于哈斯凯尔的功能性语言编译成用户定义型。 在这种混合评价中, 分享的基点是将通常的极性概念“ 变换 : ” 普遍化, 而不是仅仅将两变( 正负 和 负 ) 的按需要来实施。 我们扩展了这种逻辑性双重性的概念, “ 和 ” 是“ 或” 的双重的; 证据是双重的, 用来汇编各种类型的。 基于一种广义的数据和codal 的简单概念, 我们展示了如何使用古典的连接性评价, 来将一种广义的正反的正向的逻辑性,, 将 的 的逻辑的 的 的逻辑的 和 的 的 的 的 的逻辑的 的 的 和 的 的 的 的 的 的 的 的 的 的 的 的 的 的 和 的 的 的 的 的 和 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的 的