Проблема древовидных структур в современных языках заключается в том, что сложно создать одну структуру, которая бы подходила им всем.Существует много способов построения тройки (с указателем или без него, потомками могут быть пары (двоичные или красно-черные деревья) или списки (с и без индексации ключей поиска).
Хотя можно определитьалгоритмы обхода для всех из них, но каждый алгоритм требует отдельной реализации.
Тогда у нас возникает проблема с поиском элементов в дереве. Работаем ли мы по индексу (довольно бесполезно в двоичных деревьях)? Какой-то идентификатор?Какой тип должен иметь идентификатор? Как мы строим пути из этих идентификаторов? Как мы представляем относительные пути?
Именно поэтому у нас есть карты и списки, встроенные во многие современные языки, но без деревьев. Насколько я знаю,Scala является одним из немногих ОО-языков, которые поддерживают концепцию универсального типа дерева, но только двоичные деревья, и даже они несколько странные.
Кроме того, большинство ОО-языков не поддерживают достаточно способов построенияклассы от фрагментов существующих классов. Вы можете наследовать (но тогда вы получите все), умножитьнаследование (даже больше проблем), смешивание в (некоторые особенности множественного наследования без некоторых недостатков).Но мне действительно не хватает функции, которая говорит: возьмите метод x()
из типа Foo
и метод y()
из Bar
для построения Baz
.
Без этого, основанная на OO основа дереваКласс потребует много настроек для вашего конкретного случая использования, в то время как непосредственная реализация той же функции потребует того же количества (или даже меньше) строк кода.