Standard ML is a statically typed programming language that is suited
for the construction of both small and large programs. ``Programming
in the small'' is captured by Standard ML's Core language.
``Programming in the large'' is captured by Standard ML's
Modules language that provides constructs for organising related Core
language definitions into self-contained modules with descriptive
interfaces. While the Core is used to express details of algorithms
and data structures, Modules is used to express the overall
architecture of a software system. In Standard ML, modular programs
must have a strictly hierarchical structure: the dependency between
modules can never be cyclic. In particular, definitions of mutually
recursive Core types and values, that arise frequently in practice,
can never span module boundaries. This limitation compromises modular
programming, forcing the programmer to merge conceptually
(i.e. architecturally) distinct modules. We propose a practical and
simple extension of the Modules language that caters for cyclic
dependencies between both types and terms defined in separate
modules. Our design leverages existing features of the language,
supports separate compilation of mutually recursive modules and is
easy to implement.