Modules may accept other modules as parameters, including accepting a signature rather than a specific implementation. These are called functors, and declared using the functor keyword.
functor
(* examples/functors.sml *)