Objects

Everything is an object in Delta, including "primitive" data types such as integers. It is the task of the compiler to replace expensive object representations with a machine words where possible. (This is surprisingly easy, the analysis required for that is the same as that for some other important optimizations.)

Delta should be considered object-based, not object-oriented. I.e. it has subtypes ("interface inheritance" in OO terminology), but no subclasses (no "implementation inheritance").

Interfaces
An object may have multiple interfaces. Each interface is an abstract data type: a collection of function signatures you can call, and a set of guarantees about the outcomes of the functions.

The same object may be present multiple times. E.g. Integers have have a duplicate Monoid interface: one for addition and once for multiplication. Name clashes are resolved by naming each instance of the interface; it is also possible to rename functions.

A type is a collection of interfaces.

Type hierarchy
Types are arranged in a type hierarchy.

A subtype is required to satisfy at least the guarantees of its supertype. (This is one of the reasons why most objects are not mutable.)

Delta does not offer a default way to code inheritance. If implementing a subtype requires reusing lots of code from a superclass, the superclass code should be refactored into a separate module.