Недостаток подходов к интерфейсам (продолжение) даже в функциональных языках в том, что в них вы раскрываете детали реализации для вызывающей стороны. Они основаны на т.н. универсально-квантифицированных типах, как в Haskell (они описывают вещи, которые работают одинаково для любого типа), тогда как нам нужны экзистенциально-квантифицированные типы (работают одинаково только с определёнными, но заранее неизвестными типами) -- это и есть синоним сокрытия информации.
Как получить экзистенциальные типы? В Haskell это может выглядеть как запихивание экземпляра тайп-класса внутрь обобщённого алгебраического типа (GADT) -- его конструктор может возвращать связанные значения не своего типа. Но всё равно даже в Haskell это не работает для бинарных функций: я не смогу гарантировать, что две структуры данных одного типа при пересечении в программе используют, например, одну и ту же [реализацию] библиотеку мемоизации (они ведь могут использовать разные глобальные состояния, хотя им нужно использовать одно и то же).
Тут полезно вспомнить теорему Рейнольдса об абстракции... Проблема с классами типов -- это вывод типов и глобальный контекст, который обычно в высшей степени антимодулен. Классы типов никогда не смогут стать заменой модулям. Всё, что заставляет их работать таким образом, сильно ошибочно.
На этом тема интерфейсов закрыта, подробный материал в СильныхИдеях.
Post #760
809
- ✍ 6
- 👍 1
- 👏 1