Opaque types

Непрозрачните типове (opaque types) са потребителски типове, самият тип е публичен (public) и може да се използва и от други модули, но конструкторите му са частни (private) и могат да се използват само в модула, в който е дефиниран типът. По този начин другите модули не може да конструират стойности от този тип, нито да правят съпоставяне с шаблони върху него.

Това е полезно, когато създаваме типове с интелигентни конструктори (smart constructors). Интелигентният конструктор е функция, която създава стойност от даден тип, но с повече ограничения от тези, които би имало, ако програмистът можеше директно да извика конструкторите на типа. Така е по- лесно да се гарантира, че типът се използва правилно.

Например, този потребителски тип PositiveInt (положително цяло число) е непрозрачен (opaque). Другите модули е нужно да използват функцията new (нов) за да конструират стойност от този тип. Тази функция гарантира, че цялото число е положително.