Much like all dynamically typed languages are poor statically typed languages, typed functional programming languages (corresponding to intuitionistic logic) are subsumed by linear logic. Girard articulates this unity in the logical context. Let us gloss the functional programming side of things.

Linear logic allows us to recover intuitionistic fragment via the exponential modality \( ! \). \( !A \) is the perennialization of \( A \); one translates intuitionistic formulas as

\( A \rightarrow B := !A \multimap B \\ A \vee B := !A \oplus !B \\ A \wedge B := A \& B \)

Programming languages such as ATS and Rust do things differently, associating linearity/perenniality with a named type; a value of type ptr (say) is perennial and can be duplicated and discarded as in C, while a value of type list is linear and must be used exactly once. Values which are stack-allocated or stored in registers are perennial while heap-allocated values are linear.

Though Rust focuses on manual memory management, values backed by a garbage collector fit into this scheme: functional languages correspond to intuitionistic logic, and their values are perennial and should be typed like i64 in Rust.

Conversely, functional languages could add linear types in this way, distinguishing mutable arrays or pointers as linear.


Any new general-purpose language without linear types is already obsolete. Users should be wary of new languages that do not bother to offer linear types.