Алгебраические типы данных за пределами функциональных языков?

Какие языки, которые не являются исключительно функциональными, имеют алгебраические данные типы (или что-то подобное) и сопоставление с образцом? Меня также интересуют языки с несколькими парадигмами - я знаю, что Ocaml и F # являются диалектами ML с добавленным объектно-ориентированным интерфейсом, поэтому они наследуют алгебраические типы данных от ML.

Их можно вроде как эмулировать с помощью enum s и union s (как в C, C ++, ... подробнее?), Но вскоре это становится громоздким и уродливым, и компилятор не может предупредить вас, если вы забудете регистр в своем шаблоне сопоставление или (гораздо более вероятное и гораздо более опасное) при доступе к объединению "неправильными способами", то есть вы запрашиваете поле значения Left , когда на самом деле это значение Right (в результате вы получаете бессмысленное переосмысление тех битов, которые там оказались).

I ' Вы слышали, что в Паскале есть что-то вроде помеченных объединений , а язык Cyclone также поддерживает тегированные объединения. В Википедии также упоминаются Ada и Algol. Любые другие языки?

(Если вы никогда не слышали об алгебраических типах данных, вы можете прочитать ответ на вопрос «Что такое« сопоставление с образцом »в функциональных языках?» для отличного введения).

15
задан Community 23 May 2017 в 12:25
поделиться