In Reason, you can hide the implementation of a type and reveal exactly what you choose to. This type abstraction is one of the best techniques for preserving invariants (rules that should be obeyed) in your codebase. Type abstraction also allows modules to be decoupled from each other's implementation details, and work only with the information they have from exported interfaces.
For example, look at the Ch03_ModuleType.Person module. It exports a t type to represent information about a person, and a make function to properly create values of the t type. The make function ensures that we properly trim and capitalize the names that we're given. We want to enforce the rule that names should have the proper casing and should not have surrounding whitespace.
The problem is we can do something like this:
let bob = {Ch03_ModuleType.Person.id: 1, name: "...