Типы определяют гранулярность композиции, то есть растяжимость.
Например, интерфейс, например Сопоставимый, который объединяет (таким образом, объединяет) равенство и операторы отношений. Таким образом, невозможно создать только один интерфейс равенства или реляционный интерфейс.
Как правило, принцип замещения наследования неразрешим. Парадокс Рассела подразумевает, что любое расширяемое множество (т. Е. Не перечисляет тип каждого возможного члена или подтипа) может включать в себя, т. Е. Является подтипом самого себя. Но чтобы идентифицировать (решить), что является подтипом, а не самим собой, инварианты самого себя должны быть полностью перечислены, таким образом, он больше не расширяем. Это парадокс, что подтип расширяемости делает наследование неразрешимым. Этот парадокс должен существовать, иначе знание будет статичным и, следовательно, формирование знания не будет существовать .
Композиция функции - это сюръективная подстановка подтипа, потому что вход функции может быть заменен ее выводом, т. Е. В любом месте, где ожидается тип вывода, тип ввода можно заменить, заключив его в вызов функции. Но композиция не делает биективный контракт подтипирования - доступ к интерфейсу вывода функции, не доступ к экземпляру ввода функции.
Таким образом, композиция не должна поддерживать будущие (то есть неограниченные) инварианты и, следовательно, может быть как расширяемой, так и разрешимой. Подтип может быть НАМНОГО более мощным, если его можно достоверно решить, потому что он поддерживает этот биективный контракт, например, функция, которая сортирует неизменный список супертипа, может работать с неизменным списком подтипа.
Таким образом, вывод состоит в том, чтобы перечислить все инварианты каждого типа (то есть его интерфейсы), сделать эти типы ортогональными (максимизировать гранулярность композиции), а затем использовать композицию функций для выполнения расширения, где эти инварианты не будут ортогональными. Таким образом, подтип подходит только в том случае, если он доказуемо моделирует инварианты интерфейса супертипа, а дополнительный интерфейс (ы) подтипа доказуемо ортогональны инвариантам интерфейса супертипа. Таким образом, инварианты интерфейсов должны быть ортогональны.
Теория категорий предоставляет правила для модели инвариантов каждого подтипа, т.е. Functor, Applicative и Monad, которые сохраняют композицию функций на поднятых типах , т. Е. См. Вышеупомянутые Пример мощности подтипов для списков.