Venue. ICFP
2026
Programmable Property-Based Testing keles-2026-programmable
2025
Frex: Dependently Typed Algebraic Simplification allais-2025-frex
Reasoning about Weak Isolation Levels in Separation Logic alnormathiasen-2025-reasoning
Truly Functional Solutions to the Longest Uptrend Problem (Functional Pearl) dinges-2025-truly
Type Theory in Type Theory using a Strictified Syntax kaposi_pujet_2025
Fulls Seldom Differ koch-2025-fulls
Type Universes as Kripke Worlds koronkevich-2025-type
Modular Reasoning about Error Bounds for Concurrent Probabilistic Programs li-2025-modular
2024
Error Credits: Resourceful Reasoning about Error Bounds for Higher-Order Probabilistic Programs aguirre-2024-error
How to Bake a Quantum Π carette-2024-how
2023
Explicit Refinement Types ghalayini-2023-explicit
Verifying Reliable Network Components in a Distributed Separation Logic with Dependent Separation Protocols gondelman-2023-verifying
Modular Models of Monoids with Operations yang-2023-modular
2021
Symbolic and automatic differentiation of languages elliottSymbolicAutomaticDifferentiation2021
Deriving efficient program transformations from rewrite rules li-2021-deriving
Compositional optimizations for CertiCoq paraskevopoulou-2021-compositional
Reasoning about effect interaction by fusion yang-2021-reasoning
2020
Recovering purity with comonads and capabilities choudhury-2020-recovering
Program sketching with live bidirectional evaluation lubin-2020-program
2019
Cubical Agda: A Dependently Typed Programming Language with Univalence and Higher Inductive Types VezzosiMortbergAbel2019
Implementing a modal dependent type theory gratzer-2019-implementing
Dijkstra monads for all maillard-2019-dijkstra
Synthesizing symmetric lenses miltner-2019-synthesizing
2018
What you needa know about Yoneda: profunctor optics and the Yoneda lemma (functional pearl) boisseau-2018-what
Relational algebra by way of adjunctions gibbons-2018-relational
Reasonably programmable literal notation omar-2018-reasonably
Partially-static data as free extension of algebras yallop-2018-partially
Graduality from Embedding-Projection Pairs new_ahmed_2018
Gradually typed languages allow statically typed and dynamically typed code to interact while maintaining benefits of both styles. The key to reasoning about these mixed programs is Siek-Vitousek-Cimini-Boyland’s (dynamic) gradual guarantee, which says that giving components of a program more precise types only adds runtime type checking, and does not otherwise change behavior. In this paper, we give a semantic reformulation of the gradual guarantee called graduality. We change the name to promote the analogy that graduality is to gradual typing what parametricity is to polymorphism. Each gives a local-to-global, syntactic-to-semantic reasoning principle that is formulated in terms of a kind of observational approximation.
Utilizing the analogy, we develop a novel logical relation for proving graduality. We show that embedding-projection pairs (ep pairs) are to graduality what relations are to parametricity. We argue that casts between two types where one is “more dynamic” (less precise) than the other necessarily form an ep pair, and we use this to cleanly prove the graduality cases for casts from the ep-pair property. To construct ep pairs, we give an analysis of the type dynamism relation—also known as type precision or naïve subtyping—that interprets the rules for type dynamism as compositional constructions on ep pairs, analogous to the coercion interpretation of subtyping.
2017
A Specification for Dependent Types in Haskell weirich_etal_2017
2016
Datafun: a functional Datalog arntzenius-2016-datafun
Higher-order ghost state jung_higher-order_2016
Oh Lord, Please Don’t Let Contracts be Misunderstood (Functional Pearl) dimoulas_new_findler_felleisen_2016
Contracts feel misunderstood, especially those with a higher-order soul. While software engineers appreciate contracts as tools for articulating the interface between components, functional programmers desperately search for their types and meaning, completely forgetting about their pragmatics.
This gem presents a novel analysis of contract systems. Applied to the higher-order kind, this analysis reveals their large and clearly unappreciated software engineering potential. Three sample applications illustrate where this kind of exploration may lead.
Fully Abstract Compilation via Universal Embedding new_bowman_ahmed_2016
A fully abstract compiler guarantees that two source components are observationally equivalent in the source language if and only if their translations are observationally equivalent in the target. Full abstraction implies the translation is secure: target-language attackers can make no more observations of a compiled component than a source-language attacker interacting with the original source component. Proving full abstraction for realistic compilers is challenging because realistic target languages contain features (such as control effects) unavailable in the source, while proofs of full abstraction require showing that every target context to which a compiled component may be linked can be back-translated to a behaviorally equivalent source context.
We prove the first full abstraction result for a translation whose target language contains exceptions, but the source does not. Our translation—specifically, closure conversion of simply typed λ-calculus with recursive types—uses types at the target level to ensure that a compiled component is never linked with attackers that have more distinguishing power than source-level attackers. We present a new back-translation technique based on a shallow embedding of the target language into the source language at a dynamic type. Then boundaries are inserted that mediate terms between the untyped embedding and the strongly-typed source. This technique allows back-translating non-terminating programs, target features that are untypeable in the source, and well-bracketed effects.
2014
Folding domain-specific languages: deep and shallow embeddings (functional Pearl) gibbons-2014-folding
2013
Productive coprogramming with guarded recursion atkey-2013-productive
Complete and easy bidirectional typechecking for higher-rank polymorphism dunfield-2013-complete
Handlers in action kammar-2013-handlers
2011
Just do it: simple monadic equational reasoning gibbons-2011-just
Parsing with derivatives: A functional pearl mightParsingDerivativesFunctional2011
We present a functional approach to parsing unrestricted context-free grammars based on Brzozowski’s derivative of regular expressions. If we consider context-free grammars as recursive regular expressions, Brzozowski’s equational theory extends without modification to context-free grammars (and it generalizes to parser combinators). The supporting actors in this story are three concepts familiar to functional programmers - laziness, memoization and fixed points; these allow Brzozowski’s original equations to be transliterated into purely functional code in about 30 lines spread over three functions.
Yet, this almost impossibly brief implementation has a drawback: its performance is sour - in both theory and practice. The culprit? Each derivative can double the size of a grammar, and with it, the cost of the next derivative.
Fortunately, much of the new structure inflicted by the derivative is either dead on arrival, or it dies after the very next derivative. To eliminate it, we once again exploit laziness and memoization to transliterate an equational theory that prunes such debris into working code. Thanks to this compaction, parsing times become reasonable in practice.
We equip the functional programmer with two equational theories that, when combined, make for an abbreviated understanding and implementation of a system for parsing context-free languages.
2010
Total parser combinators danielssonTotalParserCombinators2010
A monadic parser combinator library which guarantees termination of parsing, while still allowing many forms of left recursion, is described. The library’s interface is similar to those of many other parser combinator libraries, with two important differences: one is that the interface clearly specifies which parts of the constructed parsers may be infinite, and which parts have to be finite, using dependent types and a combination of induction and coinduction; and the other is that the parser type is unusually informative.
The library comes with a formal semantics, using which it is proved that the parser combinators are as expressive as possible. The implementation is supported by a machine-checked correctness proof.