Какие языки, которые не являются исключительно функциональными, имеют алгебраические данные типы (или что-то подобное) и сопоставление с образцом? Меня также интересуют языки с несколькими парадигмами - я знаю, что Ocaml и F # являются диалектами ML с добавленным объектно-ориентированным интерфейсом, поэтому они наследуют алгебраические типы данных от ML.
Их можно вроде как эмулировать с помощью enum
s и union
s (как в C, C ++, ... подробнее?), Но вскоре это становится громоздким и уродливым, и компилятор не может предупредить вас, если вы забудете регистр в своем шаблоне сопоставление или (гораздо более вероятное и гораздо более опасное) при доступе к объединению "неправильными способами", то есть вы запрашиваете поле значения Left
, когда на самом деле это значение Right
(в результате вы получаете бессмысленное переосмысление тех битов, которые там оказались).
I ' Вы слышали, что в Паскале есть что-то вроде помеченных объединений , а язык Cyclone также поддерживает тегированные объединения. В Википедии также упоминаются Ada и Algol. Любые другие языки?
(Если вы никогда не слышали об алгебраических типах данных, вы можете прочитать ответ на вопрос «Что такое« сопоставление с образцом »в функциональных языках?» для отличного введения).