The role of opaque types to build abstractions