Какие языки, которые не являются исключительно функциональными, имеют алгебраические данные типы (или что-то подобное) и сопоставление образцов? Меня также интересуют языки с несколькими парадигмами - я знаю, что Ocaml и F # - это диалекты ML с добавлением OO, поэтому они наследуют алгебраические типы данных от ML.
Они могут быть эмулированы с использованием enum
и union
(как в C, С++,... больше?), но это скоро становится громоздким и уродливым, и компилятор не может вас предупредить, если вы забудьте случай в вашем сопоставлении с образцом или (гораздо более уязвимый и более опасный) при доступе к союзу "неправильно", т.е. вы запрашиваете поле значения Left
, когда оно фактически является значением Right
(что вы получаете тогда бессмысленную переинтерпретацию битов, которые бывают там).
Я слышал, что Паскаль имеет что-то вроде помеченных объединений и Язык Cyclone поддерживает тегированные союзы. Википедия также упоминает Аду и Алгол. Любые другие языки?
(Если вы никогда не слышали об алгебраических типах данных, вы можете прочитать ответ на вопрос "Что такое" соответствие шаблонов "на функциональных языках?" для отличного введения).