Demonstration venue · read-only. Every page can be browsed; the buttons that would change it are switched off. Create an account to run TaxoReview on your own data. A simulation from public publication records: the people listed were not invited and did not agree to review.
? Tutorial for this page

Jana Dunfield

dblp:38/6042 · DBLP profile ↗
← Back
15ranked-venue papers
8as first author
1since 2021 · last 2023
0000-0002-3718-3395ORCID · verified

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 15 · 8 first-author · 1 since 2021Theory of computation · 2 · 1 first-author

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Software engineering, system software, and programming languages
6 papers
Programming languages and type systems · 94% Program analysis · 4% Compilers and program optimization · 2%
Theoretical computer science
1 paper
Algorithms and data structures · 100%

Topics — the 20 heaviest of 21, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Programming languages and type systems › type systems
refinement types
0.922023
Focusing on Refinement Typing · ACM Trans. Program. Lang. Syst. 2023
Sums of uncertainty: refinements go gradual · POPL 2017
Programming languages and type systems › language semantics › formal semantics
denotational semantics
0.712023
Focusing on Refinement Typing · ACM Trans. Program. Lang. Syst. 2023
Programming languages and type systems › type systems
subtyping
0.712023
Focusing on Refinement Typing · ACM Trans. Program. Lang. Syst. 2023
Programming languages and type systems › type systems
type soundness
0.712023
Focusing on Refinement Typing · ACM Trans. Program. Lang. Syst. 2023
Programming languages and type systems › type checking
bidirectional type checking
0.422019
Sound and complete bidirectional typechecking for higher-rank polymorphism with existentials and indexed types · Proc. ACM Program. Lang. 2019
Tridirectional typechecking · POPL 2004
Programming languages and type systems › functional programming › algebraic data types
generalized algebraic data types
0.412019
Sound and complete bidirectional typechecking for higher-rank polymorphism with existentials and indexed types · Proc. ACM Program. Lang. 2019
Programming languages and type systems › type systems › polymorphism
higher-rank polymorphism
0.412019
Sound and complete bidirectional typechecking for higher-rank polymorphism with existentials and indexed types · Proc. ACM Program. Lang. 2019
Programming languages and type systems › type theory › dependent types
indexed types
0.412019
Sound and complete bidirectional typechecking for higher-rank polymorphism with existentials and indexed types · Proc. ACM Program. Lang. 2019
Programming languages and type systems › control structures
pattern matching
0.312017
Sums of uncertainty: refinements go gradual · POPL 2017
Program analysis › static analysis
incremental analysis
0.212015
Incremental computation with names · OOPSLA 2015
Programming languages and type systems › programming paradigms
self-adjusting computation
0.212015
Incremental computation with names · OOPSLA 2015
Compilers and program optimization
program transformation
0.112012
Type-directed automatic incrementalization · PLDI 2012
Programming languages and type systems › type theory
existential types
0.112019
Sound and complete bidirectional typechecking for higher-rank polymorphism with existentials and indexed types · Proc. ACM Program. Lang. 2019
Programming languages and type systems › type theory
dependent types
0.012004
Tridirectional typechecking · POPL 2004
Programming languages and type systems › type inference
principal types
0.012004
Tridirectional typechecking · POPL 2004
Programming languages and type systems
type checking
0.012004
Tridirectional typechecking · POPL 2004
Programming languages and type systems
type systems
0.012004
Tridirectional typechecking · POPL 2004
Programming languages and type systems
type theory
0.012004
Tridirectional typechecking · POPL 2004
Algorithms and data structures
dynamic algorithms
0.012012
Type-directed automatic incrementalization · PLDI 2012
Algorithms and data structures › dynamic algorithms
incremental algorithms
0.012012
Type-directed automatic incrementalization · PLDI 2012

Methods — techniques the papers use, named apart from their topics

focalization · 1.0call-by-push-value · 0.7bidirectional typing · 0.7SMT · 0.7soundness and completeness proof · 0.4refinement types · 0.4type theory · 0.3refinement typing · 0.3from-scratch consistency proof · 0.2core calculus · 0.2type-directed compilation · 0.1
YearPublicationVenuePosition
2023 Focusing on Refinement Typing
abstract
We present a logically principled foundation for systematizing, in a way that works with any computational effect and evaluation order, SMT constraint generation seen in refinement type systems for functional programming languages. By carefully combining a focalized variant of call-by-push-value, bidirectional typing, and our novel technique of value-determined indexes, our system generates solvable SMT constraints without existential (unification) variables. We design a polarized subtyping relation allowing us to prove our logically focused typing algorithm is sound, complete, and decidable. We prove type soundness of our declarative system with respect to an elementary domain-theoretic denotational semantics. Type soundness implies, relatively simply, the total correctness and logical consistency of our system. The relative ease with which we obtain both algorithmic and semantic results ultimately stems from the proof-theoretic technique of focalization.
Dimitrios J. Economou, Neelakantan R. Krishnaswami, Jana Dunfield
ACM Trans. Program. Lang. Syst.3
2019 Sound and complete bidirectional typechecking for higher-rank polymorphism with existentials and indexed types
abstract
Bidirectional typechecking, in which terms either synthesize a type or are checked against a known type, has become popular for its applicability to a variety of type systems, its error reporting, and its ease of implementation. Following principles from proof theory, bidirectional typing can be applied to many type constructs. The principles underlying a bidirectional approach to indexed types (generalized algebraic datatypes) are less clear. Building on proof-theoretic treatments of equality, we give a declarative specification of typing based on focalization. This approach permits declarative rules for coverage of pattern matching, as well as support for first-class existential types using a focalized subtyping judgment. We use refinement types to avoid explicitly passing equality proofs in our term syntax, making our calculus similar to languages such as Haskell and OCaml. We also extend the declarative specification with an explicit rules for deducing when a type is principal, permitting us to give a complete declarative specification for a rich type system with significant type inference. We also give a set of algorithmic typing rules, and prove that it is sound and complete with respect to the declarative system. The proof requires a number of technical innovations, including proving soundness and completeness in a mutually recursive fashion.
Jana Dunfield, Neelakantan R. Krishnaswami
Proc. ACM Program. Lang.1
2017 Extensible Datasort Refinements
Jana Dunfield
ESOP1
2017 Sums of uncertainty: refinements go gradual
abstract
A long-standing shortcoming of statically typed functional languages is that type checking does not rule out pattern-matching failures (run-time match exceptions). Refinement types distinguish different values of datatypes; if a program annotated with refinements passes type checking, pattern-matching failures become impossible. Unfortunately, refinement is a monolithic property of a type, exacerbating the difficulty of adding refinement types to nontrivial programs.
Khurram A. Jafery, Jana Dunfield
POPL2
2015 Elaborating evaluation-order polymorphism
abstract
We classify programming languages according to evaluation order: each language fixes one evaluation order as the default, making it transparent to program in that evaluation order, and troublesome to program in the other. This paper develops a type system that is impartial with respect to evaluation order. Evaluation order is implicit in terms, and explicit in types, with by-value and by-name versions of type connectives. A form of intersection type quantifies over evaluation orders, describing code that is agnostic over (that is, polymorphic in) evaluation order. By allowing such generic code, programs can express the by-value and by-name versions of a computation without code duplication. We also formulate a type system that only has by-value connectives, plus a type that generalizes the difference between by-value and by-name connectives: it is either a suspension (by name) or a "no-op" (by value). We show a straightforward encoding of the impartial type system into the more economical one. Then we define an elaboration from the economical language to a call-by-value semantics, and prove that elaborating a well-typed source program, where evaluation order is implicit, produces a well-typed target program where evaluation order is explicit. We also prove a simulation between evaluation of the target program and reductions (either by-value or by-name) in the source program. Finally, we prove that typing, elaboration, and evaluation are faithful to the type annotations given in the source program: if the programmer only writes by-value types, no by-name reductions can occur at run time.
Jana Dunfield
ICFP1
2015 Incremental computation with names
abstract
Over the past thirty years, there has been significant progress in developing general-purpose, language-based approaches to incremental computation, which aims to efficiently update the result of a computation when an input is changed. A key design challenge in such approaches is how to provide efficient incremental support for a broad range of programs. In this paper, we argue that first-class names are a critical linguistic feature for efficient incremental computation. Names identify computations to be reused across differing runs of a program, and making them first class gives programmers a high level of control over reuse. We demonstrate the benefits of names by presenting Nominal Adapton, an ML-like language for incremental computation with names. We describe how to use Nominal Adapton to efficiently incrementalize several standard programming patterns---including maps, folds, and unfolds---and show how to build efficient, incremental probabilistic trees and tries. Since Nominal Adapton's implementation is subtle, we formalize it as a core calculus and prove it is from-scratch consistent, meaning it always produces the same answer as simply re-running the computation. Finally, we demonstrate that Nominal Adapton can provide large speedups over both from-scratch computation and Adapton, a previous state-of-the-art incremental computation system.
Matthew A. Hammer, Jana Dunfield, Kyle Headley, Nicholas Labich, Jeffrey S. Foster, Michael Hicks 0001, David Van Horn
OOPSLA2
2014 Implicit self-adjusting computation for purely functional programs
abstract
Abstract Computational problems that involve dynamic data, such as physics simulations and program development environments, have been an important subject of study in programming languages. Building on this work, recent advances in self-adjusting computation have developed techniques that enable programs to respond automatically and efficiently to dynamic changes in their inputs. Self-adjusting programs have been shown to be efficient for a reasonably broad range of problems, but the approach still requires an explicit programming style, where the programmer must use specific monadic types and primitives to identify, create, and operate on data that can change over time. We describe techniques for automatically translating purely functional programs into self-adjusting programs. In this implicit approach, the programmer need only annotate the (top-level) input types of the programs to be translated. Type inference finds all other types, and a type-directed translation rewrites the source program into an explicitly self-adjusting target program. The type system is related to information-flow type systems and enjoys decidable type inference via constraint solving. We prove that the translation outputs well- typed self-adjusting programs and preserves the source program's input–output behavior, guaranteeing that translated programs respond correctly to all changes to their data. Using a cost semantics, we also prove that the translation preserves the asymptotic complexity of the source program.
Yan Chen 0001, Jana Dunfield, Matthew A. Hammer, Umut A. Acar
J. Funct. Program.2
2014 Elaborating intersection and union types
abstract
Abstract Designing and implementing typed programming languages is hard. Every new type system feature requires extending the metatheory and implementation, which are often complicated and fragile. To ease this process, we would like to provide general mechanisms that subsume many different features. In modern type systems, parametric polymorphism is fundamental, but intersection polymorphism has gained little traction in programming languages. Most practical intersection type systems have supported only refinement intersections , which increase the expressiveness of types (more precise properties can be checked) without altering the expressiveness of terms; refinement intersections can simply be erased during compilation. In contrast, unrestricted intersections increase the expressiveness of terms, and can be used to encode diverse language features, promising an economy of both theory and implementation. We describe a foundation for compiling unrestricted intersection and union types: an elaboration type system that generates ordinary λ-calculus terms. The key feature is a Forsythe-like merge construct. With this construct, not all reductions of the source program preserve types; however, we prove that ordinary call-by-value evaluation of the elaborated program corresponds to a type-preserving evaluation of the source program. We also describe a prototype implementation and applications of unrestricted intersections and unions: records, operator overloading, and simulating dynamic typing.
Jana Dunfield
J. Funct. Program.1
2013 Complete and easy bidirectional typechecking for higher-rank polymorphism
abstract
Bidirectional typechecking, in which terms either synthesize a type or are checked against a known type, has become popular for its scalability (unlike Damas-Milner type inference, bidirectional typing remains decidable even for very expressive type systems), its error reporting, and its relative ease of implementation. Following design principles from proof theory, bidirectional typing can be applied to many type constructs. The principles underlying a bidirectional approach to polymorphism, however, are less obvious. We give a declarative, bidirectional account of higher-rank polymorphism, grounded in proof theory; this calculus enjoys many properties such as eta-reduction and predictability of annotations. We give an algorithm for implementing the declarative system; our algorithm is remarkably simple and well-behaved, despite being both sound and complete.
Jana Dunfield, Neelakantan R. Krishnaswami
ICFP1
2012 Elaborating intersection and union types
abstract
Designing and implementing typed programming languages is hard. Every new type system feature requires extending the metatheory and implementation, which are often complicated and fragile. To ease this process, we would like to provide general mechanisms that subsume many different features.
Jana Dunfield
ICFP1
2012 Type-directed automatic incrementalization
abstract
Application data often changes slowly or incrementally over time. Since incremental changes to input often result in only small changes in output, it is often feasible to respond to such changes asymptotically more efficiently than by re-running the whole computation. Traditionally, realizing such asymptotic efficiency improvements requires designing problem-specific algorithms known as dynamic or incremental algorithms, which are often significantly more complicated than conventional algorithms to design, analyze, implement, and use. A long-standing open problem is to develop techniques that automatically transform conventional programs so that they correctly and efficiently respond to incremental changes.
Yan Chen 0001, Jana Dunfield, Umut A. Acar
PLDI2
2011 Implicit self-adjusting computation for purely functional programs
abstract
Computational problems that involve dynamic data, such as physics simulations and program development environments, have been an important subject of study in programming languages. Building on this work, recent advances in self-adjusting computation have developed techniques that enable programs to respond automatically and efficiently to dynamic changes in their inputs. Self-adjusting programs have been shown to be efficient for a reasonably broad range of problems but the approach still requires an explicit programming style, where the programmer must use specific monadic types and primitives to identify, create and operate on data that can change over time.
Yan Chen 0001, Jana Dunfield, Matthew A. Hammer, Umut A. Acar
ICFP2
2008 Programming with proofs and explicit contexts
abstract
This paper explores a new point in the design space of functional programming: functional programming with dependently-typed higher-order data structures described in the logical framework LF. This allows us to program with proofs as higher-order data. We present a decidable bidirectional type system that distinguishes between dependently-typed data and computations. To support reasoning about open data, our foundation makes contexts explicit. This provides us with a concise characterization of open data, which is crucial to elegantly describe proofs. In addition, we present an operational semantics for this language based on higherorder pattern matching for dependently typed objects. Based on this development, we prove progress and preservation
Brigitte Pientka, Jana Dunfield
PPDP2
2004 Tridirectional typechecking
abstract
In prior work we introduced a pure type assignment system that encompasses a rich set of property types, including intersections, unions, and universally and existentially quantified dependent types. This system was shown sound with respect to a call-by-value operational semantics with effects, yet is inherently undecidable.In this paper we provide a decidable formulation for this system based on bidirectional checking, combining type synthesis and analysis following logical principles. The presence of unions and existential quantification requires the additional ability to visit subterms in evaluation position before the context in which they occur, leading to a tridirectional type system. While soundness with respect to the type assignment system is immediate, completeness requires the novel concept of contextual type annotations, introducing a notion from the study of principal typings into the source program.
Jana Dunfield, Frank Pfenning
POPL1
2003 Type Assignment for Intersections and Unions in Call-by-Value Languages
Jana Dunfield, Frank Pfenning
FoSSaCS1