English

Flexible and Reversible Conversion between Extensible Records and Overloading Constraints for ML

Programming Languages 2024-06-19 v1

Abstract

Most ML-like functional languages provide records and overloading as unrelated features. Records not only represent data structures, but are also used to implement dictionary passing, whereas overloading produces type constraints that are basically dictionaries subject to compiler-driven dispatching. In this paper we explore how records and overloading constraints can be converted one into the other, allowing the programmer to switch between the two at a very reasonable cost in terms of syntactic overhead. To achieve this we introduce two language constructs, namely inject and eject, performing a type-driven syntactic transformation. The former literally injects constraints into the type and produces a function adding an extra record argument. The latter does the opposite, ejecting a record argument from a function and turning fields into type constraints. The conversion is reversible and can be restricted to a subset of symbols, granting additional control to the programmer. Although what we call inject has already been proposed in literature, making it a language operator and coupling it with its reverse counterpart represent a novel design. The goal is to allow the programmer to switch from a dictionary-passing style to compiler-assisted constraint resolution, and vice versa, enabling reuse between libraries that otherwise would not interoperate.

Keywords

Cite

@article{arxiv.2406.11750,
  title  = {Flexible and Reversible Conversion between Extensible Records and Overloading Constraints for ML},
  author = {Alvise Spanò},
  journal= {arXiv preprint arXiv:2406.11750},
  year   = {2024}
}

Comments

47 pages. Accepted by Journal of Systems and Software - Special Issue on Software Language Engeneering

R2 v1 2026-06-28T17:08:58.257Z