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