module type S = sig ... endModules that provide a pretty printer will match S.
Register builds a pp function from a to_string function, and adds the module_name ^ ".pp" to the list of pretty printers. The idea is to statically guarantee that one has the desired pp function at the same point where the name is added.
module Register_pp : functor (M : sig ... end) -> S with type t := M.tRegister_pp is like Register, but allows a custom pp function rather than using to_string.